【无标题】

一、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;
    }
};

解题思路

看了别人的题解搞会了,但是思路不是自己的,所以没有参考意义,以后再来看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值