class Solution {
public:
string reverseOnlyLetters(string s) {
int n=s.size();
int left=0,right=n-1;
while(left<right)
{
if(s[left]>='a'&&s[left]<='z'||s[left]>='A'&&s[left]<='Z')
{
if(s[right]>='a'&&s[right]<='z'||s[right]>='A'&&s[right]<='Z')
{
char c=s[left];
s[left]=s[right];
s[right]=c;
left++;
right--;
}
else{
right--;
}
}
else{
left++;
}
}
return s;
}
};
用 left 指针从左边开始扫描字符串 s,right 指针从右边开始扫描字符串 s。如果两个指针都扫描到字母,且 left<right,那么交换 s[left] 和 s[right],然后继续进行扫描;否则表明反转过程结束,返回处理后的字符串。
方法一:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n=numbers.size();
for(int i=0;i<n;i++)
{
int number=target-numbers[i];
if(number>numbers[n-1]||number<numbers[i]) continue;
else{
int left=i,right=n;
while(left+1!=right)
{
int mid=(left+right)/2;
if(numbers[mid]>number) right=mid;
else left=mid;
}
if(numbers[left]==number) return {i+1,left+1};
}
}
return {};
}
};
利用遍历加二分查找的方法来做
方法二:
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n=numbers.size();
int left=0,right=n-1;
if(target<numbers[left]+numbers[left+1]||target>numbers[right]+numbers[right-1]) return{};
while(left!=right)
{
if(numbers[left]+numbers[right]==target)
return {left+1,right+1};
else if(numbers[left]+numbers[right]>target)
right--;
else left++;
}
return {};
}
};
利用双指针靠近法
class Solution {
public:
int compareVersion(string version1, string version2) {
int n = version1.length(), m = version2.length();
int i = 0, j = 0;
while (i < n || j < m) {
long long x = 0;
for (; i < n && version1[i] != '.'; ++i) {
x = x * 10 + version1[i] - '0';
}
++i; // 跳过点号
long long y = 0;
for (; j < m && version2[j] != '.'; ++j) {
y = y * 10 + version2[j] - '0';
}
++j; // 跳过点号
if (x != y) {
return x > y ? 1 : -1;
}
}
return 0;
}
};
引用了官方的题解,官方的题解对x,y的定义为int型已经无法通过全部测试样例,需要改成长整型。
思路的话就是字符chuan转数字然后数字进行比大小