剑指offer计划13(双指针简单)---java

1.1、题目1

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

1.2、解法

经典双指针,通过判断%2来分辨是否为偶数
这里有一个陷阱,注意里面的循环需要增加判断

1.3、代码

class Solution {
    public int[] exchange(int[] nums) {
        int left=0,right=nums.length-1;
        while(left<right){
            while(left<right && nums[right]%2==0)   right--;
            while(left<right && nums[left]%2!=0)   left++;
                int temp=nums[right];
                nums[right]=nums[left];
                nums[left]=temp;  
        }
        return nums;
    }
}

2.1、题目2

剑指 Offer 57. 和为s的两个数字

2.2、解法

跟两数之和差不多,可以用哈希表,但这里是双指针的单元,就用双指针吧。
两个数大时,就减少右边,两个数小时,就增大左边

2.3、代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int left=0,right=nums.length-1;
        while(left<right){
            int sum=nums[left]+nums[right];
            if(sum<target) left++;
            else if(sum==target){
                return new int[]{nums[left],nums[right]};
            }else right--; 
        }
        return new int[]{};
    }
}

3.1、题目3

剑指 Offer 58 - I. 翻转单词顺序

3.2、解法

经典双指针,trim去掉前后的空格,加进缓冲区的时候颠倒+空格
注意,j要跟着变,规范一些,字符用'',字符串用""

3.3、代码

class Solution {
    public String reverseWords(String s) {
        s = s.trim();
        if(s=="" || s==" ") return " ";
        int j =s.length()-1,i=j;
        StringBuffer str = new StringBuffer();
        while(i>=0){
            while(i>=0 && s.charAt(i)!=' ') i--;
            str.append(s.substring(i+1,j+1)+" ");
            while(i>=0 && s.charAt(i)==' ') i--;
            j=i;
        }

        return str.toString().trim();
    }
}
posted @ 2021-09-13 11:14  程序员khaos  阅读(89)  评论(0编辑  收藏  举报