21.调整数组顺序使奇数位于偶数前面
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
if(nums.empty()){
return nums;
}
int n = nums.size();
int start = 0;
int end = n - 1;
while(start <= end){
if(nums[start] % 2 != 0){
start++;
continue;
}
if(nums[end] % 2 == 0){
end--;
continue;
}
swap(nums[start], nums[end]);
}
return nums;
}
};
57. 和为s的两个数字
思路:
初始化:双指针 i , j分别指向数组 nums的左右两端 (俗称对撞双指针)。
循环搜索: 当双指针相遇时跳出; 计算和 s = nums[i] + nums[j] ;
(1) 若 s > target ,则指针 j 向左移动,即执行 j --;
(2) 若 s < target,则指针 i向右移动,即执行 i ++ ;
(3) 若 s = target ,立即返回数组[nums[i],nums[j]] ;
返回空数组,代表无和为 target的数字组合。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int s = 0;
int start = 0;
int end = nums.size() - 1;
vector<int> res;
while(start <= end){
s = nums[start] + nums[end];
if(s > target){
end--;
}else if(s < target)
{
start++;
}else{
res.push_back(nums[start]);
res.push_back(nums[end]);
return res;
}
}
return res;
}
};
58(1). 翻转单词顺序
class Solution {
public:
string reverseWords(string s) {
int n = s.size();
string res = "";
for (int i = n - 1; i >= 0; i--) {
if (s[i] != ' ') {
int end = i;
while (i >= 0 && s[i] != ' ') {
i--;
}
//从后往前,每个单词分割+拼接
res += s.substr(i + 1, end - i) + " ";
}
}
return res.substr(0, res.size() - 1);
}
};