初级算法练习第二节

72 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

1. 引言

接下来继续下一题开展对应leetcode 习题课中初级算法题目的练习,这个就当我的学习笔记了,大家一起交流,让我们一起学习变得更好吧! 官网地址:leetcode.cn/leetbook/re…

2. 题型

  1. 整数反转:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号)。

输入:x = 123
输出:321

输入:x = -123
输出:-321

输入:x = 120
输出:21

输入:x = 0
输出:0

思路:
首先解读这道题时我们可以先想到通过什么方式可以从最后一位开始一个个拿取最后一个数字在通过它开始拼接后就是题目要的整数反转。有同学肯定想到了通过% 余除法可以获得最后一位数字; 解题中我们需要使用到js 计算中比较少见的方法:

  • js 中的~~含义 ~是js里的按位取反操作符 , ~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0。 ~~"" == 0 ~~[] == 0
  • Math.pow(底数,几次方) 直接使用Math.pow(a,3)即可,即等于求a的3次方。

题目中有个需要注意的点:“反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]”,反转的数字是有范围限定的。 所以首先先通过余除法获得当前要反转的最后一个数字,接着使用~~ 反转获得目标对象缩小一个十分位后的值,在rev 这个统计数据中计算增长一个十分位值并且加上反转值,代表当前值反转;在判断下临界值,结束。 注意:x = ~~(x / 10); 按位取反后会过滤掉小数点后面的值 一定要操作,这样每次while循环时候,x都有在缩小一个十分位;

解答:

var reverse = function(x) {
    let rev = 0;
    while (x !== 0){
        const last = x % 10;
        console.log('前', x / 10)
        x = ~~(x / 10);
        console.log('后', x)
        rev = rev * 10 + last;
        if(rev < Math.pow(-2, 31) || rev > Math.pow(2, 31) - 1){
            return 0
        }

    }
    return rev
};


  1. 最长公共前缀: 编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

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

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


提示:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

思路:    首先做临界判断排除目标对象为空字符串;其二,因为根据题意是寻找数组内每个元素的共同最长字符串,所以选取目标参照对比物的时候可以始终选择数组第一个元素ans;定义两层for循环,第一层的i起始值为1,代表需要对比的目标对象元素序号,第二层的for循环j代表着每个对比目标元素对象字符串从默认起始位0开始对比;i受限于目标对象本身的长度,j不仅也受限于目标对象本身长度,并且也受限每个对比元素的长度,超过目标对象的长度则直接循环结束; 当发现ans对应序号j的字符串与目标对象整体strs[i][j]的序号对应字符串不想等时候跳出当前循环,否则内层for循环持续执行,直到找到不对等字符串时,for循环结束后这样就可以记录到相同字符串最后的序号,就可以推导出相同字符串的内容。ans 就截取对应j序列长度的字符为共同字符串。 在最后回抛前做判空处理。 该方法时间复杂度为O(1);空间复杂度为o(1) 解答:

/**
 * @param {string[]} strs
 * @return {string}
 */
var longestCommonPrefix = function(strs) {
    if(strs.length == 0) 
        return "";
    let ans = strs[0];
    for(let i =1;i<strs.length;i++) {
        let j=0;
        for(;j<ans.length && j < strs[i].length;j++) {
            if(ans[j] != strs[i][j])
                break;
        }
        ans = ans.substr(0, j);
        if(ans === "")
            return ans;
    }
    return ans;
};