首页 > 试题广场 >

循环右移

[编程题]循环右移
  • 热度指数:1136 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
有一个二进制数的字符串,想把字符串循环右移k位,然后得到一个新的二进制数,求这个数的十进制值是多少。给定一个二进制字符串str和循环位移位数k,返回循环后的二进制数的十进制值。

示例1

输入

"10110",2

输出

21

说明

新二进制串为“10101”,十进制值为21 

备注:
import java.util.*;
public class Solution {
    /**
     * 位移后二进制串的十进制值
     * @param str string字符串 二进制字符串
     * @param k int整型 循环位移次数
     * @return long长整型
     */
    public long rotateRight(String str, int k) {
        // write code here
        if (k > str.length()) {
            k = k % str.length();
        }
        String head = str.substring(str.length() - k);
        String tail = str.substring(0, str.length() - k);

        str = head + tail;
        return Long.parseLong(str, 2);
    }
}

发表于 2021-10-06 23:56:38 回复(0)
    运行时间:20ms超过1.87% 用Java提交的代码 。 哈哈哈 
对了 。 。。 我用LONG最后2位一直加不上。 真就加不上。 望大佬解答
    public long rotateRight (String str, int k) {
      StringBuilder sb = new StringBuilder(str);
        int len = str.length();
        for (int i = 0; i < k; i++) {
            char end = sb.charAt(len - 1);
            sb.insert(0, end);
            sb.deleteCharAt(sb.length() - 1);
        }
        String res = sb.toString();
        len = res.length();
        BigDecimal total = new BigDecimal("0");
        for (int i = 0; i < len; i++) {
            total = total.add(new BigDecimal(Integer.parseInt(String.valueOf(res.charAt(i))) * Math.pow(2, len - 1 - i) + ""));
        }
        return total.longValue();
    }



编辑于 2021-06-03 16:09:58 回复(2)
public long rotateRight (String str, int k) {
        // write code here
        char []s=str.toCharArray();
        int i,j;
        for(i=1;i<=k;i++)
        {
            char ch=s[s.length-1];
            for(j=s.length-1;j>=1;j--)
                s[j]=s[j-1];
            s[0]=ch;
        }
        String s1=new String(s);
        return Long.parseLong(s1,2);
    }

编辑于 2021-03-27 15:49:50 回复(0)
 public long rotateRight (String str, int k) {
        // write code here
       StringBuffer s=new StringBuffer(str);
        for(int i=0;i<k;i++){
            char s1=s.charAt(str.length()-1);
            s.deleteCharAt(str.length()-1);
            s.insert(0,s1);
        }
        long z=0;
        int j=0;
        while(s.length()>0){
            int zzz=s.charAt(s.length()-1)-'0';
            long zz=(long)Math.pow(2,j)*zzz;
            z+=zz;
            j++;
            s.deleteCharAt(s.length()-1);
        }
        return z;

        
    }

发表于 2021-03-10 13:41:44 回复(0)
public static long rotateRight (String str, int k) {
            // write code here
         return Long.parseLong(str.substring(str.length()-k,str.length())+str.substring(0,str.length()-k),2);
    }

运行11ms 有点长
发表于 2021-02-02 12:07:34 回复(0)
long long rotateRight(string str, int k) {
        // write code here
        int size=str.size();
        k=k%size;
        string cpy;
        for(int i=size-k;i<size;++i){
            cpy+=str[i];
        }
        for(int i=0;i<size-k;++i){
            cpy+=str[i];
        }
        long long x=1;
        long long num=0;
        for(int i=size-1;i>=0;--i){
            num+=(cpy[i]-'0')*x;
            x*=2;
        }
        return num;
    }

贡献一个C++版本的

发表于 2020-10-10 04:04:32 回复(0)
【牛客编程巅峰赛S1第6场】循环右移 讲得很好了,这里给出两行python实现的代码。
运行时间:38ms 占用内存:6520KB 使用语言:Python 3 用例通过率:100.00%
class Solution:
    def rotateRight(self, str, k):
        str = str[len(str)-k:len(str)]+str[0:len(str)-k]
        return int(str, 2)


编辑于 2020-10-09 12:27:13 回复(0)