题意:
有一个二进制数的字符串,把字符串循环右移k位,然后得到一个新的二进制数,求这个数的十进制值是多少。
给定一个二进制字符串str和循环位移位数k,返回循环后的二进制数的十进制值。
方法一:
剪切模拟
思路:将低k位二进制串和高(n-k)位二进制串拼接成新串,然后再计算新串二进制数的十进制值。
class Solution {
public:
long long rotateRight(string str, int k) {
int n=str.size();
string res=str.substr(n-k)+str.substr(0,n-k);//得到新的字符串
long long sum=0,x=1;
for(int i=n-1;i>=0;i--){//从后往前遍历
if(res[i]=='1'){//如果是‘1’,则加上该位的权重
sum+=x;
}
x<<=1;//计算权重
}
return sum;
}
};
时间复杂度:,n为字符串长度
空间复杂度:,n为存储新字符串的长度空间
方法二: 直接模拟
思路:直接模拟,不需要组建新串,先计算后k位,再计算前n-k位。注意点:(sum<<1),右移要加括号。
class Solution {
public:
long long rotateRight(string str, int k) {
int n=str.size();
long long sum=0;
for(int i=n-k;i<n;i++){//先计算后k位
sum=(sum<<1)+str[i]-'0';
}
for(int i=0;i<n-k;i++){//再计算前n-k位
sum=(sum<<1)+str[i]-'0';
}
return sum;
}
};
时间复杂度:,n为字符串长度
空间复杂度:,n为存储新字符串的长度空间



京公网安备 11010502036488号