重复数字
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
- HashMap<Integer,Boolean>,map.
containsKey
(x),如果为true,代表数据重复
- HashSet<Integer>特性,set.
add
(x),如果为false,代表数据重复。
- 优解O(n),O(1)。
每个数字都放到其对应下标下,如果对应下标下的值与自己相同,说明重复。
https://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524?tpId=13&tqId=11203&tab=answerKey&from=cyc_github
二维数组中的查找
给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。
- 从左上开始遍历,依次减少一行或者一列的范围。
https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github
替换空格
将一个字符串中的空格替换成 "%20"。
- 用StringBuilder直接
.append
('%20')
- 优解
先用.charAt==(i)
' '判断有几个空格,在字符串末尾加上空格个数*2的字符串大小。用于后续存储3个字符中的2个字符空间。
p1指向原字符串末尾,p2指向现字符串末尾。
依次向前遍历,不是空格p2复制p1,是空格,依次插入02%。直到遍历结束
https://www.nowcoder.com/practice/0e26e5551f2b489b9f58bc83aa4b6c68?tpId=13&tqId=11155&tab=answerKey&from=cyc_github
顺时针打印矩阵
按顺时针的方向,从外到里打印矩阵的值。
- 确定矩阵的四个边界,然后循环输出。将边界缩小,重复上述过程。
https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github
第一个只出现一次的字符位置
在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。
- HashMap
- 用int数组代替HashMap,
.charAt(i)
作为下标
- 优解 统计3种情况,可以用2位二进制处理,即2个Byte存储出现的个数。
BitSet bs1 = new BitSet(128);
!bs1.get(c) && !bs2.get(c) 未出现过
bs1.get(c) && !bs2.get(c) 出现过一次
bs1.set(c); 设置为1,表示出现过了
https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github
引用仓库:https://github.com/CyC2018/CS-Notes/blob/master/notes/%E5%89%91%E6%8C%87%20Offer%20%E9%A2%98%E8%A7%A3%20-%20%E7%9B%AE%E5%BD%95.md