和为 S 的两个数字
在有序数组中找出两个数,使得和为给定的数 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。
1.Hash表处理
因为要求和为S,乘积最小。所以如果我从小到大依次判断,得出来的第一个结果一定符合要求。用减法求差,判断所需值,是否出现过。
HashMap mp = new HashMap();
!mp.containsKey(temp)
mp.put(array[i], i);
res.add(temp);
2.优解-双指针
二分,从两边往中间找。
如果大了,则将右指针左移。否则反之。
https://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b?tpId=13&tqId=11195&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github
和为 S 的连续正数序列
输出所有和为 S 的连续正数序列。例如和为 100 的连续序列有:
[9, 10, 11, 12, 13, 14, 15, 16]
[18, 19, 20, 21, 22]。
枚举
从1开始加,超了下一个,没超是答案,只要循环一半即可。优解-双指针
一个指向起始,一个指向尾。利用公式计算其和的大小。
因为考虑所有情况,初始时,左指针1,右指针2。
如果和小了,右指针加1,让它加的值变多。如果和大了,左指针加1,让它加的变少。如果和为目标值,将数组放到答案中。
ArrayList > res = new ArrayList >();
ArrayList temp = new ArrayList();
//记录区间序列
for(int i = l; i <= r; i++)
temp.add(i);
res.add(temp);
https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe?tpId=13&tqId=11194&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github
翻转单词顺序列
Input:
"I am a student."
Output:
"student. a am I"
- 分割+倒序
- 数组思想处理:将字符串先分割成一个数组,存储到
新数组
中去,然后倒序输出即可。需要去除首尾空格。
String[] strs = str.trim().split(" ");
res.append(strs[i] + " ");
- 指针思想处理:两个指针指向尾部,左指针左移,直到第一个空格,将单词取出,放到
输出数组
中。然后将双指针,移到一起移到下个单词末尾,重复上述操作。
while(i >= 0 && str.charAt(i) != ' ') i--; // 搜索首个空格
res.append(str.substring(i + 1, j + 1) + " "); // 添加单词
while(i >= 0 && str.charAt(i) == ' ') i--; // 跳过单词间空格
这2个方法一定会用到一个新增的数组,没办法在原数组上修改。
- 优解-双指针二次反转
将整个char数组反转,再在反转后的数组里面,将单词反转,输出结果。
所以需要一个函数,用于将字符数组中的两个字符交换。
然后第一次将整个数组交换,第二次将单词位置交换即可。
//字符串反转函数
private void reverse(char [] c, int l, int h){
//双指针反转
while(l < h)
swap(c, l++, h--);
}
//字符交换函数
private void swap(char [] c, int l, int h){
char temp = c[l];
c[l] = c[h];
c[h] = temp;
}
char[] c = str.toCharArray();
return new String(c);
https://www.nowcoder.com/practice/3194a4f4cf814f63919d0790578d51f3?tpId=13&tqId=11197&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github
左旋转字符串
将字符串 S 从第 K 位置分隔成两个子字符串,并交换这两个子字符串的位置。
Input:
S="abcXYZdef"
K=3
Output:
"XYZdefabc"
- 双指针旋转
数学题。abcXYZdef->cbafedZYX->XYZdefabc
关键代码同上。
https://www.nowcoder.com/practice/12d959b108cb42b1ab72cef4d36af5ec?tpId=13&tqId=11196&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