题解 | #循环右移#

循环右移

http://www.nowcoder.com/practice/1d461107631246e693bda9a4f9cc50b8

题意

以字符串的形式给一个二进制数,对这个二进制数循环右移kkk位,求右移结果的十进制的值。

二进制位数小于等于636363

方法

模拟

按照题意,我们操作字符串k次,每次移动一位,63次后得到了目标的二进制表示的字符串

再对二进制字符串进行转化成10进制,需要注意的是这里是long long 不是int

代码

class Solution {
public:
    /**
     * 位移后二进制串的十进制值
     * @param str string字符串 二进制字符串
     * @param k int整型 循环位移次数
     * @return long长整型
     */
    long long rotateRight(string str, int k) {
        for(int i = 0;i<k;i++){
            char ch = str[str.length()-1];
            str = ch+str;
            str.pop_back();
        }
        long long res = 0;
        for(int i = 0;i<str.length();i++){
            res*=2;
            res+= str[i]-'0';
        }
        return res;
    }
};

复杂度分析

时间复杂度:

我们首先操作字符串k次, 每次将字符串最后一位移动到最前,时间复杂度为 O(k)O(k)O(k)

然后是进制转换,对每一位进行操作一次所以复杂度是O(len(str))O(len(str))O(len(str)),综上 总时间时间复杂度为O(k+len(str))O(k+len(str))O(k+len(str))

空间复杂度: 只用了常数大小的额外空间来记录结果和做for循环,所以空间复杂度为O(1)O(1)O(1)

抽象优化

如果我们需要算111nnn的和,我们并不需要循环从111nnn,而是可以直接求和公式,同样,虽然说题目描述是循环右移,那么可以看一下当前位置与实际位置的区别,从意义上完成一个等效的操作,而不去实际操作它

以样例数据为例

- 1 0 1 1 0
实际位置 2 3 4 0 1
当前位置 0 1 2 3 4
当前位置 2-2 3-2 4-2 5+0-2 5+1-2
实际位置 当前位置
i(i>=k)i(i>=k)i(i>=k) iki-kik
i(i<k)i(i<k)i(i<k) len(str)+iklen(str)+i-klen(str)+ik

这样的位置可以用取模汇总成一个表达式

实际位置 当前位置
iii (len(str)+ik)<mtext> </mtext>mod<mtext> </mtext>len(str)(len(str)+i-k)\bmod len(str)(len(str)+ik)modlen(str)

f(i)=(len(str)+ik)<mtext> </mtext>mod<mtext> </mtext>len(str)f(i)= (len(str)+i-k)\bmod len(str)f(i)=(len(str)+ik)modlen(str), f()=f(实际位置)=当前位置f()=

因此原来的进制转换是s[0 ~ len(str)-1],现在变成s[f(0) ~ f(len(str)-1)]

代码

class Solution {
public:
    /**
     * 位移后二进制串的十进制值
     * @param str string字符串 二进制字符串
     * @param k int整型 循环位移次数
     * @return long长整型
     */
    long long rotateRight(string str, int k) {
        long long res = 0;
        for(int i = 0;i<str.length();i++){
            res*=2;
            res+= str[((int)str.length()-k+i)%str.length()]-'0';
        }
        return res;
    }
};

复杂度分析

时间复杂度: 我们省去了字符串的操作步骤,直接转换,每一位一次运算,以时间复杂度是O(len(str))O(len(str))O(len(str))

空间复杂度: 只用了常数大小的额外空间来记录结果和做for循环,所以空间复杂度为O(1)O(1)O(1)

全部评论

相关推荐

序&nbsp;朋友们,好久不见。&nbsp;笔者在过去消失的五个月里被困在情绪牢笼中过的相当煎熬,一度丢失自己,觉得整个世界都是昏暗的。&nbsp;庆幸的是靠着自己纯硬扛也是走出来了。表达欲再度回归,所以真的很开心还有机会能在再和大家见面。&nbsp;破碎秋招&nbsp;抑郁情绪的引爆点必然是秋招期间遭受的打击了,从去年九月份腾讯转正被告知失败之后就开始疯狂投递简历,每天都在经历:简历挂、一面挂、二面挂、三面挂、HR面挂,每天睁开眼就被无所适从的挫败感包围。&nbsp;秋招的特点是即便流程走到最后一步也不一定会&nbsp;offer,因为还需要进入大池子进行横向对比,俗称泡池子,而这一泡我的大多数面试流程到后面就没了后文,这一度让我感觉非常绝望。我深知自己学历并...
SoNiC_X:我已经工作快2年了,当时高考没考好没去到想去的学校,觉得天要塌了;校招找不到工作,觉得天要塌了;现在工作觉得看不到未来,觉得天要塌了;最近最大的感悟就是:天会一直塌,但是生活也会一直继续下去,还是要调整好自己的心态,不要因为一时的困难把自己困住,要记住完蛋的日子永远在后头
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务