LeetCode刷题笔记—双指针题型集锦(283.移动零、167. 两数之和 II - 输入有序数组、557. 反转字符串中的单词 III )
283. 移动零 (简单)
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0] 说明: 必须在原数组上操作,不能拷贝额外的数组。 尽量减少操作次数。
思路:定义两个指针i和j,让i和j都指向开头数组第一个元素,然后保持j不动,向右移动i指针,当i指针指向的数是0时,i指针向前移动一位,j指针不动;当i指针指向的数不是0时,就将i指向的值赋值给j指向的位置(是直接覆盖不是交换),然后i继续向前移动一位,j也向前移动一位,直到i到达数组最末位,然后将i与j之间的数换成0即可
动图来自动画演示 283.移动零 - 移动零 - 力扣(LeetCode) (leetcode-cn.com)
代码:
class Solution { public void moveZeroes(int[] nums) { int i = 0,j = 0; for(;i<nums.length;++i){ if(nums[i] != 0){ nums[j] = nums[i]; ++j; } }//当i到尾的时候,将j位置到结尾都赋值为0即可 for(;j<nums.length;j++){ nums[j] = 0; } } }
167. 两数之和 II - 输入有序数组(简单)
题目描述:
给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。 函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例 1: 输入:numbers = [2,7,11,15], target = 9 输出:[1,2] 解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。 示例 2: 输入:numbers = [2,3,4], target = 6 输出:[1,3] 示例 3: 输入:numbers = [-1,0], target = -1 输出:[1,2] 提示: 2 <= numbers.length <= 3 * 104 -1000 <= numbers[i] <= 1000 numbers 按 递增顺序 排列 -1000 <= target <= 1000 仅存在一个有效答案
看到是一个升序数组,想到双指针,定义两个指针left和right,left指向数组第一个元素,right指针指向最后一个元素,当指针指向的两个数的和大于target时,将右指针向左移动一位;当指针指向的两个数的和小于target时,将左指针向右移动一位,以此来向target值逼近。
代码:
class Solution { public int[] twoSum(int[] numbers, int target) { int left = 0,right = numbers.length - 1; while(left<right){ if(numbers[left] + numbers[right] > target){ --right; } if(numbers[left] + numbers[right] < target){ ++left; } if(numbers[left] + numbers[right] == target){ break; } } int[] result = {left+1,right+1}; return result; } }
557. 反转字符串中的单词 III (简单)
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例: 输入:"Let's take LeetCode contest" 输出:"s'teL ekat edoCteeL tsetnoc" 提示: 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
本题较简单,直接看代码即可。
class Solution { public String reverseWords(String s) { StringBuffer ret = new StringBuffer(); int length = s.length(); int i = 0; while (i < length) { int start = i; while (i < length && s.charAt(i) != ' ') { i++; } for (int p = start; p < i; p++) { ret.append(s.charAt(start + i - 1 - p)); } while (i < length && s.charAt(i) == ' ') { i++; ret.append(' '); } } return ret.toString(); } }

浙公网安备 33010602011771号