一、917. 仅仅反转字母
题目描述
给你一个字符串 s ,根据下述规则反转字符串:
所有非英文字母保留在原有位置。
所有英文字母(小写或大写)位置反转。
返回反转后的 s 。
代码示例
class Solution {
bool isLetters(char ch){
if(ch>='A'&&ch<='Z'){
return 1;
}else if(ch>='a'&&ch<='z'){
return 1;
}
return 0;
}
public:
string reverseOnlyLetters(string s) {
int l=0,r=s.length()-1;
while(l<r){
if(!isLetters(s[l])){
++l;
continue;
}
if(!isLetters(s[r])){
--r;
continue;
}
swap(s[l],s[r]);
++l,--r;
}
return s;
}
};
解题思路
双指针,两个变量分别表示要交换的两个数据,如果不是字母就跳过该数据
二、167. 两数之和 II - 输入有序数组
题目描述
给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
你所设计的解决方案必须只使用常量级的额外空间
代码示例
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
//贪心
int l=0,r=numbers.size()-1;
int tmp;
while(l<r){
tmp=numbers[l]+numbers[r];
if(tmp>target){
--r;
}else if(tmp<target){
++l;
}else if(tmp==target){
return {l+1,r+1};
}
}
return {};
}
};
解题思路
贪心+双指针,一个升序数组,取两边,小于目标值就取较小值的下一位,也就是更大的,并且大最小的那个。大于目标值则相反。
三、165. 比较版本号
题目描述
给你两个版本号 version1 和 version2 ,请你比较它们。
版本号由一个或多个修订号组成,各修订号由一个 ‘.’ 连接。每个修订号由 多位数字 组成,可能包含 前导零 。每个版本号至少包含一个字符。修订号从左到右编号,下标从 0 开始,最左边的修订号下标为 0 ,下一个修订号下标为 1 ,以此类推。例如,2.5.33 和 0.1 都是有效的版本号。
比较版本号时,请按从左到右的顺序依次比较它们的修订号。比较修订号时,只需比较 忽略任何前导零后的整数值 。也就是说,修订号 1 和修订号 001 相等 。如果版本号没有指定某个下标处的修订号,则该修订号视为 0 。例如,版本 1.0 小于版本 1.1 ,因为它们下标为 0 的修订号相同,而下标为 1 的修订号分别为 0 和 1 ,0 < 1 。
返回规则如下:
如果 version1 > version2 返回 1,
如果 version1 < version2 返回 -1,
除此之外返回 0。
代码示例
class Solution {
public:
int compareVersion(string v1, string v2) {
if(v1==v2){
return 0;
}
int i = 0, j = 0;
while(i < v1.size() || j < v2.size())
{
long long num1 = 0, num2 = 0;
//获取最开始一位的数值大小
while(i < v1.size() && v1[i] != '.') num1 = num1 * 10 + v1[i++] - '0';
while(j < v2.size() && v2[j] != '.') num2 = num2 * 10 + v2[j++] - '0';
//判断
if(num1 > num2) return 1;
else if( num1 < num2) return -1;
//失败则进行下一次循环
i++,j++;
}
return 0;
}
};
解题思路
看了一个题解,个人非常喜欢这个思路,所以就用了这个思路
具体思路已在注释中给出
四、443. 压缩字符串
题目描述
给你一个字符数组 chars ,请使用下述算法压缩:
从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 :
如果这一组长度为 1 ,则将字符追加到 s 中。
否则,需要向 s 追加字符,后跟这一组的长度。
压缩后得到的字符串 s 不应该直接返回 ,需要转储到字符数组 chars 中。需要注意的是,如果组长度为 10 或 10 以上,则在 chars 数组中会被拆分为多个字符。
请在 修改完输入数组后 ,返回该数组的新长度。
你必须设计并实现一个只使用常量额外空间的算法来解决此问题。
代码示例
class Solution {
public:
int compress(vector<char>& chars) {
int n = chars.size();
int write = 0, left = 0;
for (int read = 0; read < n; read++) {
if (read == n - 1 || chars[read] != chars[read + 1]) {
chars[write++] = chars[read];
int num = read - left + 1;
if (num > 1) {
int anchor = write;
while (num > 0) {
chars[write++] = num % 10 + '0';
num /= 10;
}
reverse(&chars[anchor], &chars[write]);
}
left = read + 1;
}
}
return write;
}
};
解题思路
看了别人的题解搞会了,但是思路不是自己的,所以没有参考意义,以后再来看