剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
这个题采用双指针即可,分别指向当前奇数的位置和偶数的位置,如果奇数再后便将两者互换,否则继续后移
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
if(nums.size()==0) return nums;
int i=0;int j=0;
while(i<nums.size()&&j<nums.size()){
if(nums[i]%2==1&&nums[j]%2==0&&i>j){
swap(nums[i],nums[j]);
i++;j++;
}
else if(nums[i]%2==1&&nums[j]%2==0&&i<j){
i++;
}
else{
if(nums[i]%2==0) i++;
if(nums[j]%2==1) j++;
}
}
return nums;
}
};
剑指 Offer 57. 和为s的两个数字
先将数组排序,然后一前一后两个指针,当和大于给定值时j–,小于给定值时i++,直到和与给定值相同
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i=0;
int j=nums.size()-1;
vector<int>ans;
while(i<j){
if(nums[i]+nums[j]>target)
j--;
else if(nums[i]+nums[j]<target)
i++;
else{
ans.push_back(nums[i]);
ans.push_back(nums[j]);
break;
}
}
return ans;
}
};
剑指 Offer 58 - I. 翻转单词顺序
这题用快慢指针来查询每一个单词,从后往前当找到一个单词时便将单词加入到结果字符串,中间补充空格即可
class Solution {
public:
string reverseWords(string s) {
string str= " ";
str+= s;
s.clear();
int leng= str.size();
int i= leng - 1;
int j= leng - 1;
while (j>= 0) {
if (str[i] != ' ' && str[j] == ' ') {
s += str.substr(j+ 1, i- j);
s += ' ';
i= j;
}
if (str[i] == ' ') {
i--;
}
j--;
}
s.pop_back();
return s;
}
};