Loading

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();
        }
    }

 

posted @ 2021-08-14 16:12  StormArcita  阅读(65)  评论(0)    收藏  举报