[编程之美] 2.17 字符串循环移位

题目

将字符串向右循环移动 k 位

s = "abcd123" k = 3
Return "123abcd"

思路

方法一 翻转法

将子串 s[0:str.length() - k)] 翻转,子串s[str.length() - k,str.length()] 翻转。然后将整个字符翻转可以到最终结果。

eg:
将 abcd123 中的 abcd 和 123 单独翻转,得到 dcba321,然后对整个字符串进行翻转,得到 123abcd。

class Solution {
    public String reverseString(String str1) {
        char[] chs = str1.toCharArray();
        for(int i =0,j = str1.length()-1;i<j;i++,j--){
            char tmp = chs[i];
            chs[i] = chs[j];
            chs[j] = tmp;
        }
        return new String(chs);
    }
    public String turnright(String str,int k){
        String substr1 = reverseString(str.substring(0,str.length() - k));
        String substr2 = reverseString(str.substring(str.length() - k,str.length()));
        return reverseString(substr1+substr2);
    }
 }
public class Main {
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.turnright("abcd123",3));
    }
}

方法二 扩展法

生成新 ss = s+s,取ss[str.length() - k:str.length() - k + str.length()]

class Solution {
    public String turnright(String str,int k){
        String ss = str+str;
        return ss.substring(str.length()-k,str.length()-k+str.length());
    }
 }
public class Main {
    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.turnright("abcd123",3));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值