每日一练-左旋字符串

题目链接

左旋转字符串

题目描述

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列 S ,请你把其循环左移 K 位后的序列输出。例如,字符序列 S = ”abcXYZdef” , 要求输出循环左移 3 位后的结果,即 “XYZdefabc” 。

输入输出

示例1:

输入:
"abcXYZdef",3
返回值:
"XYZdefabc"

示例2:

输入:
"aab",10
返回值:
"aba"
题目分析

方法一:

  • n 表示左移次数,当n=str.length()时,字符串又恢复原样,所以可以通过step = n%str.length()进行去重,得到需要移动的次数step.
  • 通过toCharArray()把字符串str转化为数组,更容易操作
  • 保存数组的第一个字符,剩下的整体前移一个,再把第一个放在最后,完成一次移动,一次能移动,利用循环完成多次
代码运行
public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str.length()==0||n==0){
            return str;
        }
        char[] ch = str.toCharArray();
        int len = ch.length;
        int step = n%len;//去重
        while(step>0){
            step--;
            char tmp = ch[0];//先把第一个数暂时放在tmp处
            int i = 0;
            while(i<(len-1)){
                ch[i] = ch[i+1];//把后面的数一位一位的往前移,最后一个位置会空出来
                i++;
            }
            ch[len-1] = tmp;//把暂存起来的值放在最后一个位置
        }
        return new String(ch);
    }
}

方法二:

  • 局部逆置:对[0,step-1]范围之间的字符进行逆置,再对余下的字符进行逆置
  • 整体逆置:对字符串整体进行逆置

如:String str = " 123abc ", n = 2左移两位结果是:3abc12
操作步骤: [0,step-1]逆置:213abc------>余下的字符进行逆置:21cba3------>整体逆置:3abc12

运行代码
public class Solution {
    public void  reverse(char[] ch,int start,int end){
        while(start<end){
            char tmp = ch[start];
            ch[start] = ch[end];
            ch[end] = tmp;
            start++;
            end--;
        }         
    }
    public String LeftRotateString(String str,int n) {
        if(str.length()==0||n==0){
            return str;
        }
        char[] ch = str.toCharArray();
        int len = ch.length;
        int step = n%len;//去重
         reverse(ch,0,step-1);
        reverse(ch,step,len-1);
        reverse(ch,0,len-1);
        return new String(ch);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值