相信我,小白也能愉快的刷完leetcode一百题(附题号)

算法还是要以兴趣为主,如果前期体验不到刷题的快乐,那刷题之旅大概率就到此结束了。
本篇就列举一些leetcode上,小白见了狂喜的100道题,由此刷上自信心,刷上成就感!渡过新手村

水题【题号: 名称】

复制题号即可找到相应原题

2235: 俩整数相加
072: 平方根 (等同于69 x的平方根 ) Math.sqrt开平方
1323: 6和9最大的位置 replace替换字符
367: 有效的完全平方数 Number.isInteger判断是否为整数
剑指offer 16 (等同于50Pow(x,n)题: n&1===1 判断是否奇数, x**n 等同于pow: (x,n) x的n次方
位运算八道题: 还是用&符巧解 :2的幂一定是1接n个0,然后-1就成全是1,在&一下,全是0则是2的幂
326 3的幂
面试题16.01.交换数字
面试题08.05递归算法
2119反转两次的数字
剑指offer 58Ⅱ左旋字符串
剑指 Offer 58 - II. 左旋转字符串 :substring包头不包尾
面试题 16.07.最大值
1812.判断国际棋盘中一个格子的颜色 charCodeAt转化成ASCLL码判断
268丢失的数字
1486 数组的异或操作
1009.十进制整数的反码
476数字的补数
剑指 Offer 15. 二进制中1的个数 同191
2220.转换数字的最少位翻转次数
1342.将数字变成 0 的操作次数
1492.n 的第 k 个因子
2006.差的绝对值为 K 的数对数目
1929.数组串联
1108.IP 地址无效化
1837.K 进制表示下的各位数字总和
504.七进制数
33.搜索旋转排序数组
153.寻找旋转排序数组中的最小值
1920.基于排列构建数组
1672.最富有客户的资产总量
剑指 Offer 04.二维数组中的查找 === 240.搜索二维矩阵 II
535.TinyURL 的加密与解密
剑指 Offer II 018.有效的回文 === 125.验证回文串
LCP 17.速算机器人
2011.执行操作后的变量值
剑指 Offer 05.替换空格
217.存在重复元素
912.排序数组
1480.一维数组的动态和
704 二分查找
35 搜索插入位置
2236.判断根结点是否等于子结点之和
1979.找出数组的最大公约数
2177.找到和为给定整数的三个连续整数
LCP 06. 拿硬币
2278.字母在字符串中的百分比
1018.可被 5 整除的二进制前缀
剑指 Offer 10- I. 斐波那契数列
509.斐波那契数
1137.第 N 个泰波那契数
剑指 Offer 10- II. 青蛙跳台阶问题
70 爬楼梯
剑指 Offer II 088. 爬楼梯的最少成本
1447.最简分数
746.使用最小花费爬楼梯
145.二叉树的后序遍历
1952.三除数
面试题 16.10. 生存人数
1512.好数对的数目
2206.将数组划分成相等数对
930.和相同的二元子数组 (待做)
剑指 Offer 64. 求1+2+…+n
1688.比赛中的配对次数
2169.得到 0 的操作数
1614.括号的最大嵌套深度

位运算八道题:

231 2的幂、342 4的幂 、191 位1的个数、136 只出现一次的数字、461汉明距离、639交替位二进制数、1863找出所有子集的异或总和再求和、371两整数之和、


刷完后可以从下面的来继续练手

数组针对训练:
排序:
查找:
数组:
字符串:
二分查找:


一些例子

1.1 二分查找(704)

给定一个升序数组和待查找元素,返回元素在数组的位置没有返回-1。

思路:通过中间元素跟待查找元素比大小,根据:mid = left + Math.floor((right - left) / 2) 来决定下次查找中间键往哪靠,最左边最右边怎么变。大了:中间键就得往左,因为left不变,整体值变小,所以right 要变小,反之同理。

var search = function(nums, target) {
    let left=0;
    let right =nums.length -1;
    while(left <= right){
        let mid = left + Math.floor((right - left) / 2);
        const num=nums[mid];
        if(nums[mid] == target){
            return mid;
        }else if(num < target){
                left = mid + 1;
        }else{
                right = mid - 1;
        }
    }
    return -1;
};
1.2.第一个错误版本(208)

二分查找的异化,也是一串有序数组,第N个数及后面通过isBadVersion()为true,其余false,找到这个N。

思路:上面是对比大小,这里是对比布尔值,为真就说明超过那个N了,这里就更新右边边界,为假就说明还没到,更新左边边界,不断缩小区间。我想过如果中间值恰巧是N,这里也不能直接返回right值结束,因为这样会增加判断次数由此增加执行时间。

var solution = function(isBadVersion) {
    return function(n) {
        let left =1;
        let right =n;
        while(left < right ){
            const mid =left+ Math.floor((right-left)/2);
            if(isBadVersion(mid)){
                right =mid;
            }else{
                left =mid+1;
            }
        }
        return left;
    };
};
1.3.搜索插入位置(35)

例子:

输入: nums = [1,3,5,6], target = 5
输出: 2

输入: nums = [1,3,5,6], target = 7
输出: 4

依旧是模版小改,整体思路差不多

var searchInsert = function(nums, target) {
const n = nums.length;
    let left = 0, right = n - 1, ans = n;
    while (left <= right) {
        let mid = ((right - left) >> 1) + left;
        if ( nums[mid] >= target ) {
            ans = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return ans;
};
2.1.有序数组的平方(977)

平方之后在排序,下面这种是最简单直观的。

var sortedSquares = function(nums) {
    var arr = []
    for(var i= 0;i < nums.length;i++){
        arr.push(Math.pow(nums[i],2))
    }
    arr.sort((a,b) =>{
    return a-b;
    })
    return arr;
};

或者利用双指针排序,因为题目说了是非递减顺序数组(就是按自然数序列排布),这说明最大值要么是最左边要么是最右边,所以在最开始判断哪边值最大,就可以 以此写入。

var sortedSquares = function(nums) {
        let left = 0;
        let right = nums.length - 1;
        let result = [];
        let write = nums.length - 1;
        while (left <= right){
            if (Math.pow(nums[left],2) > Math.pow(nums[right],2)){
                result[write] = Math.pow(nums[left],2);
                left ++;
                write --;
            }
            else {
                result[write] = Math.pow(nums[right],2);
                right --;
                write --;
            }
        }
        return result;
};
2.2.旋转数组(189)

将数组整体向右移N个数,输出移动后的数组。

这里考点就是怎么处理N位后元素,超过数组边界的从头开始计算,这里我想到了取余方式安置元素,将整个数组进行重新绘制后输出。

var rotate = function(nums, k) {
  const n = nums.length;
    const newArr = new Array(n);
    for (let i = 0; i < n; ++i) {
        newArr[(i + k) % n] = nums[i];
    }
    for (let i = 0; i < n; ++i) {
        nums[i] = newArr[i];
    }
    return nums;
};

以上

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值