题意:
有一个二进制数的字符串,把字符串循环右移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为存储新字符串的长度空间