面试中写算法是必备环节。算法题的一个特色便是假如做过了,有思路的话,很快就能够做出来;假如没做过,就很考验临场发挥了。
 所以咱们在平常要注意加强算法方面的训练,在做算法题的进程中沉积出自己的解题思路,将问题进行归类和转化,做到一通百通。 

分享下刷题进程中的思路和心得

1.两数之和

描绘: 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并回来它们的数组下标。 你能够假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复呈现。 你能够按恣意次序回来答案。

解题思路:

先想到了for循环, 数组取长度,再遍历相加,最终回来和为目标值的两个数的数组下标

代码:

for(let i = 0; i < nums.length-1; i++ ){
    for(let y = i+1; y <= nums.length-1; y++){
        if(nums[i] + nums[y] === target){
            return[i,y]
        }
    }
}
};

2.回文数

描绘: 给你一个整数x,假如x是一个回文整数,回来true;否则,回来false。 回文数是纠正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121是回文,而123不是。

解题思路:

1.先将数值型转为字符串型,然后取字符串长度的一半向下取整(因为假如是奇数个元素则最中心的不需要比较) 2.使用双指针从前和从后两个方向遍历字符串,对遍历到的两个字符进行比较。假如有不同则回来false;假如都相同则回来true

代码:

var isPalindrome = function(x) {
    let xTemp = x.toString();
    for (let i = 0, j = xTemp.length - 1; i < Math.floor(xTemp.length / 2); i++, j--) {
        if (xTemp.charAt(i) !== xTemp.charAt(j)) {
            return false;
        }
    }
    return true;
    };

注[弥补]:

1.用Math.floor(xTemp.length/2); 对字符串长度除以2所得的数向下取整

2.数组的下标从0开端,字符串中第一个字符的数组下标为0,最终一个字符的数组下标为length-1。

弥补【方法二】:

这里也能够用字符串的翻转:

解题思路:

1.翻转字符串:先将数值型转为字符串型,再拆分为单字符数组,然后翻转数组,最终将数组拼接成字符串
2.将原字符串和翻转后的字符串进行比较即可

附上代码:

var isPalindrome = function(x) {
    return x.toString() === x.toString().split('').reverse().join('')
};

注【弥补】:

split()做切割;再用reverse()做回转;再用join()聚合。

3.最长公共前缀

描绘: 编写一个函数来查找字符串数组中的最长公共前缀。 假如不存在公共前缀,回来空字符串""

示例 1:

输入: strs = ["flower","flow","flight"]
输出: "fl"

示例 2:

输入: strs = ["dog","racecar","car"]
输出: ""
解说: 输入不存在公共前缀。

解题思路: 便是用第一个字符串为参阅,一个个匹配其他字符串时,截取参阅字符串的长度来比较其他字符串,不同则从后开端一位一位截,直到相同,然后又匹配下一个。就比如flower 与 flow ,第一次截取flowe 比较 flow不同持续截 flow flow相同,之后就得到了最长公共前缀。

代码:

var longestCommonPrefix = function(strs) {
//定义com为最长公共前缀
let com = strs[0];
if(strs.length == 1){
    return strs[0]
}
for( let i=0; i < strs.length; i++){
while(strs[i].slice(0, com.length)!== com){
    com = com.slice(0, com.length-1)
}
}
return com
};

注【弥补】:

1.slice()方法以新的数组目标,回来数组中被选中的元素。

2.slice()方法选择从给定的start参数开端的元素,并在给定的end参数处结束,但不包含。

4.整数转罗马数字

描绘: 罗马数字包含以下七种字符:I,V,X,L,C,D和M。

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做II,即为两个并排的 1。12 写做XII,即为X+II。 27 写做XXVII, 即为XX+V+II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做IIII,而是IV。数字 1 在数字 5 的左面,所表明的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表明为IX。这个特别的规则只适用于以下六种情况:

  • I能够放在V(5) 和X(10) 的左面,来表明 4 和 9。
  • X能够放在L(50) 和C(100) 的左面,来表明 40 和90。
  • C能够放在D(500) 和M(1000) 的左面,来表明400 和900。

给你一个整数,将其转为罗马数字。

解题思路:

使用贪心算法,从大到小顺次遍历。

从数组中大的值开端顺次遍历。直到大于数组中的某个值,就把这个值对应的罗马数值加到成果中,按数组中数值从大到小顺次遍历,直到将所供给的数值依照intArr数组的大小悉数遍历,然后转化为罗马数值即完结。

例如: 所供给的num=1002

依照贪心算法从大到小遍历,首要1002>1000,1000对应的罗马数值为M写入成果,遍历完1000后,1002-1000=2。

因为2<900,越过。

2<500,越过

….,越过

2>1,1对应的罗马数值为I写入成果,遍历完1后,2-1=1。 1=1,1对应的罗马数值为I写入成果,遍历完1后,1-1=0。

遍历完结,得到成果MII 代码:

var intToRoman = function(num) {
    let intArr=[1000,900,500,400,100,90,50,40,10,9,5,4,1];
    let RomanArr=["M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"];
    let index=0;
    let res="";
    while(index<13){
        while(num>=intArr[index]){
            res+=RomanArr[index];
            num-=intArr[index];
        }
        index++;
    }
    return res
};

注【弥补】:

index:index:遍历项下标

5.有用括号

描绘: 给定一个只包含'('')''{''}''['']'的字符串s,判别字符串是否有用。

有用字符串需满意:

  1. 左括号有必要用相同类型的右括号闭合。
  2. 左括号有必要以正确的次序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

解题思路:

根据题意,咱们能够得到一下信息:

1.有用括号字符串的长度,一定是偶数!

2.右括号前面,有必要是相对应的左括号,才干抵消!

3.右括号前面,不是对应的左括号,那么该字符串,一定不是有用的括号

进程图解:

leetcode刷题思路分享-js篇
leetcode刷题思路分享-js篇
leetcode刷题思路分享-js篇
leetcode刷题思路分享-js篇
leetcode刷题思路分享-js篇
leetcode刷题思路分享-js篇

代码:

var isValid = function(s) {
    let stack = [];
    //获取字符串中的当时符号
    for(let i=0;i<s.length;i++) {
        const start = s[i];
        //假如是最初的符号则先入栈,假如是结束的符号,就要和栈顶的符号做比较,看能不能变成一对
        if(s[i] == '('||s[i]=='{'||s[i]=='[') {
            stack.push(s[i]);
        }else{
        //栈顶元素假如是符号最初,和当时遍历的符号假如是一对儿,则栈顶元素pop出去
            const end = stack[ stack.length-1];
            if(start == ')'&& end=='(' ||
            start == '}'&& end=='{' ||
            start == ']'&& end=='[') {
                stack.pop();
            }else{
                return false;
            }
)
        }
    }
    return stack.length == 0;
}

注【弥补】:

1.假如是左括号就压入栈

2.假如是右括号,弹出栈顶,两者对应则抵消,假如最终所有括号不能悉数抵消则回来false

心得总结:

写leetcode的初体验:

在写题的进程中,遇到了许多棘手的问题,有的甚至不知道该从哪里下手,但通过上网查阅自己不明白的常识再看标题时又会有些思路。

写题的进程也是一个装备自己的进程,只要自己的常识储备更足了,解题经历更足了,解题手法更足了,才干更好的去完结每道题。

尽管开端很难,但是花时间去弄懂每道题对我来说很值得,学到的东西许多,也会有满满的成就感。让咱们一同算法刷起来,不断装备自己强大自己,搞定没到算法题!