题目详情
牛牛有一个二进制数的字符串,他想把字符串循环右移k位,然后得到一个新的二进制数,你能告诉牛牛这个数的十进制值是多少吗。给定一个二进制字符串str和循环位移位数k,返回循环后的二进制数的十进制值。
示例1
输入
"10110",2
输出
21
说明
新二进制串为“10101”,十进制值为21
备注:
1 ≤ ∣str∣ ≤ 63, 1 ≤ k ≤ ∣str∣
分析
首先先将字符串向右循环右移 k 位,一位一位去移动显得比较繁琐。
比较方便的方法是:
直接先将 字符串 看成两段,后 k 位为一段,后 k 位之前的字符串为一段
然后分别将这两段字符串逆序,得到的字符串再逆序即可。
后面将向右循环右移 k 位的字符串1所表示的二进制数 转换为 十进制数 即可。
-下面代码
class Solution {
public:
/**
* 位移后二进制串的十进制值
* @param str string字符串 二进制字符串
* @param k int整型 循环位移次数
* @return long长整型
*/
long long rotateRight(string str, int k) {
// write code here
int len = str.size();
reverse(str.begin() + len - k, str.end()); //将后k位字符串逆序
reverse(str.begin(), str.begin() + len - k); //将后k位之前的字符串逆序
reverse(str.begin(), str.end()); //再将所得字符串整体再逆序一次
long long sum = 0, t = 1;
for(int i = len - 1; i >= 0; i--) {
sum += (str[i] - 48) * t;
t *= 2;
}
return sum;
}
};