Java双指针算法题-00

和为 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,右指针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"

  1. 分割+倒序
  • 数组思想处理:将字符串先分割成一个数组,存储到新数组中去,然后倒序输出即可。需要去除首尾空格。
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个方法一定会用到一个新增的数组,没办法在原数组上修改。

  1. 优解-双指针二次反转
    将整个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"

  1. 双指针旋转
    数学题。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

你可能感兴趣的:(Java双指针算法题-00)