前端-笔试算法题
一、给定一个以字符串表示的非负整数 num,移除这个数中的K位数字,使得剩下的数字最小。
1首先,将字符串中的每个数字遍历一遍,并将它们存储在一个栈中。
2.遍历数字的同时,如果栈不为空且栈顶元素比当前数字大,那么就弹出栈顶元素,并将 k的值减一,表示已经移除了一个数字。
3.如果栈为空,或者栈顶元素比当前数字小,那么就将当前数字压入栈中。
4.当所有数字都被遍历完后,如果还有 k 个数字需要移除,就在栈中弹出 k 个元素。
5.构建结果字符串。从栈底开始遍历栈中的元素,如果当前数字是 0 且前面的数字都是 0那么就跳过这个数字。否则,将当前数字添加到结果字符串中。
6.如果结果字符串为空,就返回0”
function removeKdigits(num,k){ const stack = []; for(const digit of num){ console.log("digit",digit); while(stack.length > 0 && stack[stack.length - 1]> digit && k){ stack.pop(); k -= 1; } stack.push(digit); } for( ; k > 0 ; --k){ stack.pop(); } let ans = ""; let isLeadingZero = true; for(const digit of stack){ console.log("digit22",digit); if(isLeadingZero && digit === '0'){ continue; } isLeadingZero =false; ans+= digit; } return ans === ""? '0':ans; } console.log(removeKdigits('10200',1))//"200"
二、有效邮箱,leetcode里面的题 929. 独特的电子邮件地址
var numUniqueEmails = function(emails) { const emailSet = new Set(); for (const email of emails) { const i = email.indexOf('@'); let local = email.slice(0, i).split("+")[0]; // 去掉本地名第一个加号之后的部分 local = local.replaceAll(".", ""); // 去掉本地名中所有的句点 emailSet.add(local + email.slice(i)); } return emailSet.size; };