剑指offer计划13(双指针简单)-
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();
}
}