《代码随想录》刷题思考


语言:Java
第一章 准备面试要知己知彼
第二章 程序的形能分析

第三章 数组

704. 二分查找

704. 二分查找
【思考】

  1. int 整数的除法是向上还是向下取整?——下
  2. 循环:什么时候用 for 什么时候用 while?

【笔记】
1. 二分查找的前提:有序数组、无重复元素
2. 如何定义mid:这个跟你喜欢在闭区间里找目标值还是半开区间里找值有关,个人比较喜欢闭区间[left, right]
3. 终止条件:在闭区间里left=right是成立的,所以此时while循环的终止条件为(left <= right),一开始终止条件写成下面这样是不对的

// 这是一个恒等式
((left <= right) || (left >= 0) || (right < nums.length))

【代码】

    public static int search(int[] nums, int target) { //不能修改方法名,否则会编译失败
        // 初始化首尾坐标
        int left = 0;
        int right = nums.length - 1;
        while(left <= right) { // 终止条件:左区间大于右区间
            int mid = (left + right) / 2; // java的整数是向下取整的
            if (nums[mid] > target) { // 中间值大于target,那就要往左找
                right = mid - 1;
            } else if (nums[mid] < target) { // 中间值小于target,往右找
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

27. 移除元素

27. 移除元素
【思考】不太会原地修改,怎么个原地修改法?
如果实在是想不通,想不到方法,那可以暴力破解,但暴力破解太笨了,还是写点聪明的代码,《代码随想录》推荐了使用双指针的方法。
【思路】用双指针解决“原地算法”,有了双指针后就可以在O(1)的情况下模拟O(n)的实现

    // 思路用双指针模拟空间复杂度为O(1)的情况:左指针:新数组下标;右指针:旧数组下标
    public int removeElement(int[] nums, int val) {
        int left = 0;
        int right = 0;
        while (right < nums.length) {
            // 如果原来的数,不为被移除的数,那么新数组的数=旧值,并且指针后移继续比较
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
                right++;
            } else { // 如果原来的值等于被移除的数,则旧指针后移
                right++;
            }
        }
        return left; // left比较完后停留在新数组的最后一个位置的后面,这个值刚好为数组的长度
    }

209. 长度最小的子数组

209. 长度最小的子数组
【思想】

  • 处理连续的东西,要想到滑动窗口,滑动窗口的end是for着向前移动的,需要调整的是start指针,滑动窗口跟一开始想象的还不太一样
  • 注意看题目是≥,而不是=target
  • 单个元素的值=target的场景,也算
  • 这道题的精髓在于,当end指针固定的时候,start指针可以移动多次,所以for里面控制start指针移动时,不能用只能判断一次情况的if语句,而是要用while,因为你不知道start指针要移动多少次
  • 最后还要对,所有元素加起来不等于target的数做处理(考试的时候,如果特殊情况不知道怎么处理,可以在一开始的时候多谢几个if来避免特殊情况)

59. 螺旋矩阵II

59. 螺旋矩阵II
【思想】不难,但打印的时候一定要坚持“策略一致”,统一左闭右开或者左开右闭

第四章 链表

203. 移除链表元素

203. 移除链表元素

707. 设计链表

707. 设计链表

206. 反转链表

206. 反转链表

19. 删除链表的倒数第N个结点

19. 删除链表的倒数第N个结点

第五章 哈希表

242. 有效的字母异位词
349. 两个数组的交集
1. 两数之和
454. 四数相加II
15. 三数之和
18. 四数之和

第六章 字符串

344. 反转字符串

344. 反转字符串
【思考】

  • 这题不难,但考了一个常识,void方法里面对变量赋值了之后,方法外面对变量的变化无感知。但这个常识,如果基础不好足以致命。

541. 反转字符串II

541. 反转字符串II
【思考】

  • 读好题目是关键
  • 控制好每次只操作2k的区间
  • 剩余对长度不到k的字符串的操作,要放在for循环里,不然记录起始区间会出错

151. 反转字符串中的单词

151. 反转字符串中的单词
【思考】

  • 在处理字符串之前,可以对字符串做处理
  • String.trim() 可以删除字符串首尾的空格

28. 找出字符串中第一个匹配项的下标

28. 找出字符串中第一个匹配项的下标
【思考】

  • 学会用字符串的indexOf()方法

459. 重复的子字符串

459. 重复的子字符串
【KMP算法】还没做出来

第七章 栈与队列

232. 用栈实现队列

225. 用队列实现栈

20. 有效的括号

150. 逆波兰表达式求值

239. 滑动窗口最大值

347. 前 K 个高频元素

42. 接雨水

第八章 二叉树

第九章 回溯算法

第十章 贪心算法

第十一章 动态规划

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值