Leetcode 8 字符串转换整数
这两个方法都是看了别人的答案写出来的,如果要我写我可能一个个字符匹配然后陷入逻辑怪圈出不来了。
//调用API。
var myAtoi = function(s) {
const number = parseInt(s, 10);
if(isNaN(number)) {
return 0;
} else if (number < Math.pow(-2, 31) || number > Math.pow(2, 31) - 1) {
return number < Math.pow(-2, 31) ? Math.pow(-2, 31) : Math.pow(2, 31) - 1;
} else {
return number;
}
};
//自动机,感觉有点像策略模式和状态模式(不一样就当我智障)。每一次输入状态都会改变,状态改变时对应的处理方式也会改变。需要注意的就是使用map来决定状态的一一映射,最后输出数字的时候需要注意最大最小值的边界。
var myAtoi = function(s) {
class atoi{
constructor(){
this.state = 'start';
this.signed = 1;
this.answer = 0;
this.map = new Map([
['start', ['start', 'signed', 'number', 'end']],
['signed', ['end', 'end', 'number', 'end']],
['number', ['end', 'end', 'number', 'end']],
['end', ['end', 'end', 'end', 'end']]
])
}
getIndex(char){
if(char===' '){
return 0;
}
else if(char==='+'||char==='-'){
return 1;
}
else if(!isNaN(char)){
return 2;
}
else{
return 3;
}
}
calc(char){
this.state = this.map.get(this.state)[this.getIndex(char)];
if(this.state==='number'){
this.answer = this.answer*10 + Number(char);
this.answer = this.signed===1?Math.min(this.answer,Math.pow(2,31)-1):Math.min(this.answer,Math.pow(2,31));
}
if(this.state==='signed'){
this.signed = char==='+'?1:0;
}
}
}
let test = new atoi();
for(let i of s){
test.calc(i);
}
return test.signed===1?test.answer:-test.answer;
};
LeetCode 28 实现strStr()
//暴力,看官方解才写出来。。。。。
var strStr = function(haystack, needle) {
let m = haystack.length;
let n = needle.length;
for(let i = 0;i+n<=m;i++){
let flag = true;
for(let j = 0;j<n;j++){
if(haystack[i+j]!=needle[j]){
flag = false;
break
}
}
if(flag) {
return i;
}
}
return -1;
};
//KMP算法,有空再看看。
LeetCode 38 外观数列
//玄学计算机,类似数学归纳法的题目全部递归就行。
var countAndSay = function(n) {
let res = traceBack(n);
return res;
};
var traceBack = (n) =>{
if(n===1) return '1';
let str = traceBack(n-1);
let res = "";
for(let i = 0 ;i<str.length;){
let tmp = str[i];
let start = i++;
while(str[i]===tmp){
i++;
}
res += (i-start)+tmp;
}
return res;
}
LeetCode 14 最长公共前缀
//纵向遍历,我还以为最长公共字符串,差点写不出来。
var longestCommonPrefix = function(strs) {
let min = Number.MAX_VALUE;
for(let i of strs){
min = Math.min(min, i.length);
}
let res = "";
for(let i =0;i<min;i++){
let tmp = strs[0][i];
for(let j of strs){
if(j[i]!==tmp){
return res;
}
}
res += strs[0][i];
}
return res;
};
不得不说,cpp还是很牛的。
LeetCode 237 删除链表中的结点
//.....面试多来点这种题目。
var deleteNode = function(node) {
let tmp = node.next;
node.val = node.next.val;
node.next = tmp.next;
};