长度为三且各字符不同的子字符串&&颠倒二进制位&&找不同
【摘要】 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. 颠倒二进制位
每枚举一位 就将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. 找不同
方法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/
错误解答:小坑
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)