长度为三且各字符不同的子字符串&&颠倒二进制位&&找不同

举报
芒果_Mango 发表于 2022/11/30 23:56:37 2022/11/30
【摘要】 190. 颠倒二进制位https://leetcode.cn/problems/reverse-bits/每枚举一位 就将n右移一位,这样当前n的最低位就是我们要枚举的比特位当 n为 0 时即可结束循环class Solution {public: uint32_t reverseBits(uint32_t n) { uint32_t ans = 0; ...

190. 颠倒二进制位

https://leetcode.cn/problems/reverse-bits/

image-20220602160055857

每枚举一位 就将n右移一位,这样当前n的最低位就是我们要枚举的比特位当 n为 0 时即可结束循环


class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t ans = 0;
        for(int i = 0;i<32;i++)
        {
            ans |= (n&1)<<(31-i);
            n>>=1;
        }
        return ans;
    }
};

优化:当n已经为0,就不需要再继续处理了

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t ans = 0;
        for(int i = 0;i<32 && n>0;i++)
        {
            ans |= (n&1)<<(31-i);
            n>>=1;
        }
        return ans;
    }
};

389. 找不同

https://leetcode.cn/problems/find-the-difference/

image-20220602160728168

方法1:使用哈希表统计次数

class Solution {
public:
    char findTheDifference(string s, string t) {
        //映射字母出现的情况
        //映射到数组中即可,只含小写字母
        int count[27] = {0};
        //1.先遍历字符串 s 映射字符串s中每个字母出现的次数,将映射结果记录到数组中
        for(char c:s)
        {
            count[c - 'a'] ++;
        }
        //2然后再遍历字符串t,对数组中字母出现的次数进行抵消,如果抵消后某个字母对应出现的次数变为了负数,则说明该字母就是字符串t当中添加的字母
        for(char c:t)
        {
            //先--再判断!
            count[c-'a']--;
            if(count[c - 'a'] <0)
            {
                return c;
            }
        }
        return ' ';
    }
};

方法2:ascii码值

class Solution {
public:
    char findTheDifference(string s, string t) {
        //通过差值计算
        //两个字符串所有字符的ASCII码的差值对应就是字符串t中添加字母的ASCII码值
        int sumS = 0;
        int sumT = 0;
        for(auto c:s)
        {
            sumS+=c;
        }
        for(auto c:t)
        {
            sumT+=c;
        }
        return sumT-sumS;
    }
};

方法3:异或

相当于是找唯一单独出现的字符

class Solution {
public:
    char findTheDifference(string s, string t) {
        char ret = 0;//初始化为0
        for(auto x:s)
        {
            ret^=x;
        }
        for(auto x: t)
        {
            ret ^=x;
        }
        return ret;
    }
};	

1876. 长度为三且各字符不同的子字符串

https://leetcode.cn/problems/substrings-of-size-three-with-distinct-characters/

image-20220602161145247

错误解答:小坑

class Solution {
public:
    int countGoodSubstrings(string s) {
        int count = 0;
        for(int i = 0;i<s.size()-2;i++)
        {
            if(s[i] != s[i+1] &&  s[i] !=s[i+2] &&s[i+1]!=s[i+2])
             {
                 count++;
             }
        }
        return count;
    }
};

错误例子: x

为什么会出错呢?

原因是 s.size()的返回值是size_t无符号类型, 如果s.size()-2为负数,转为无符号整形就是很大的数, 导致程序出错!
如果要改怎么改呢?看下述两种做法:

改法1: 如果字符串字符个数<=2就返回0,保证了s.size()-2为正数

class Solution {
public:
    int countGoodSubstrings(string s) {
        int count = 0;
        if(s.size() <=2) 
        {
            return 0;
        }
        for(int i = 0;i<s.size()-2;i++)
        {
            if(s[i] != s[i+1] &&  s[i] !=s[i+2] &&s[i+1]!=s[i+2])
             {
                 count++;
             }
        }
        return count;
    }
};

改法2:直接先求出长度,定义为int类型,防止size_t造成的错误

class Solution {
public:
    int countGoodSubstrings(string s) {
        int count = 0;
        int len = s.size();
        for(int i = 0;i<len-2;i++)
        {
            if(s[i] != s[i+1] &&  s[i] !=s[i+2] &&s[i+1]!=s[i+2])
             {
                 count++;
             }
        }
        return count;
    }
};

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。