彦祖天天见
题目:最接近的三数之和
这道题目和三数之和很相似,不了解的可以先看一下三数之和。
题目要求:
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。示例 2:
输入:nums = [0,0,0], target = 1
输出:0
本题使用的解法和三数之和类似,排序+双指针。
先初始化一个结果,然后进入循环利用三数之和和目标值的差的绝对值来判断最接近的和,如果三数之和和目标值的差值为0,则为最接近的值。当和比目标值大时,将右指针左移,反之将左指针右移。
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int res = nums[0]+nums[1]+nums[2];
int _size=nums.size();
for(int i=0;i<_size;i++){
if(i>0 && nums[i] == nums[i-1]){
continue;
}
int left=i+1;
int right=_size-1;
while(left<right){
int dif=(nums[i]+nums[left]+nums[right]);
if( target-dif == 0) return dif;
if(dif>target){
res = abs(dif - target) < abs(res - target) ? dif : res;
right--;
}else{
res = abs(dif - target) < abs(res - target) ? dif : res;
left++;
}
}
}
return res;
}
};
题目:反转字符串中的单词
题目要求:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"示例 2:
输入:s = " hello world "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。示例 3:
输入:s = "a good example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
解题思想为先将字符串中的前置空格,后置空格,单词间多余空格去除,使用的是快慢指针的方法,用slow存储新字符串,fast来遍历字符串;可以参考27、移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
for(int fast=0;fast<nums.size();fast++){
if(val != nums[fast]){
nums[slow++] = nums[fast];
}
}
return slow;
}
};
去除多余空格后进行遍历,遇到单词间的空格或到字符串结尾就将前一个单词反转,然后重新标记起始点的位置。
然后使用revers反转函数交换指定区间的字符串,其中第一个参数为字符串,第二个参数为字符串中需要反转的起始位置,第三个参数为需要反转的截至为止,区间为左闭右闭。
class Solution {
public:
void reverse(string& s,int start,int end){
for(;start<end;start++,end--){
swap(s[start],s[end]);
}
}
void removespace(string& s){
int slow=0;
for(int fast=0;fast<s.size();fast++){
if(s[fast] != ' '){
//除第一次外加入空格
if(slow>0) s[slow++] = ' ';
while(s[fast] != ' ' && fast<s.size()){
//快慢指针存储新字符串
s[slow++]=s[fast++];
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
//去除前置、后置,多余空格
removespace(s);
//反转字符串
reverse(s,0,s.size()-1);
int start=0;
for(int i=0;i<=s.size();i++){
//在遇到空格或末尾时反转字符串
if(s[i] == ' ' || i==s.size()){
//此时i是空格,i-1是前一个单词最后一个字母,i+1是后一个单词的第一个字母
reverse(s,start,i-1);
start=i+1;
}
}
return s;
}
};