动态口令(左旋字符串),剑指offer,力扣

目录

题目地址:

我们直接看题解吧:

解题方法:

审题目+事例+提示:

解题思路:

方法4(字符串拼接):

代码实现:

代码优化:

方法5(三次反转):

代码实现:

代码(暴力解法):

代码(字符切片):

代码(列表拼接):


题目地址:

LCR 182. 动态口令 - 力扣(LeetCode)

难度:简单

今天刷动态口令(左旋字符串),大家有兴趣可以点上看看题目要求,试着做一下

我们直接看题解吧:

解题方法:

方法1、暴力遍历,嵌套双循环

方法2、字符串切片

方法3、列表遍历拼接

方法4、字符串拼接

方法5、三次反转

审题目+事例+提示:

前target字符按照原顺序移动至末尾

解题思路:

方法4(字符串拼接):

1、创建一个字符串变量

2、两次循环,分别将target~length-1,0~target依次拼接

3、返回更新后的字符串、

代码实现:
class Solution {
    public String dynamicPassword(String password, int target) {
        String res = "";                    //创建新字符串变量
        for(int i = target; i < password.length(); i++)//先拼接target后面部分
            res += password.charAt(i);
        for(int i = 0; i < target; i++)            //接着拼接target前面部分
            res += password.charAt(i);
        return res;                              //返回对应字符串变量
    }
}
代码优化:
class Solution {
    public String dynamicPassword(String password, int target) {
        String res = "";
        for(int i = target; i < target + password.length(); i++)
                         //利用取余运算
                         //i=target ~ password.length
                         //i=password.length ~ target+password.length
            res += password.charAt(i % password.length());
        return res;
    }
}

方法5(三次反转):

第一次,将前target部分进行反转

第二次,将target至字符串尾部分进行反转

第三次,将字符串的整体反转

代码实现:
class Solution {
    public String dynamicPassword(String password, int target) {
        //将字符串转为字符串数组,利用toCharArray()方法
       char[] pawdArr=password.toCharArray();
        int len=pawdArr.length;
       //判断是否为空,空则直接返回字符串
        if(len<=0)
            return password;
        target=target%len;//当target>len,进行取余
        reversepawd(pawdArr,0,target-1); //调用reversepawd()函数,第一次反转(0,target-1)
       reversepawd(pawdArr,target,len-1);//调用reversepawd()函数第二次反转(target,len-1)
       reversepawd(pawdArr,0,len-1);//调用reversepawd()函数,第三次反转(0,len-1)
        return new String(pawdArr);//new新字符串装更新后的字符数组
    }
     //创建反转函数方法,参数为对应字符数组,反转的起始位位置与结束位置
    public void reversepawd(char[] array,int begin,int end){  //反转字符串,前后指针
        for(;begin<end;begin++,end--){
           // begin 与end 依次互换
            char c=array[begin];
            array[begin]=array[end];
            array[end]=c;
        }
    }

代码(暴力解法):

//这里Str即password,n即target
  public String LeftRotateString(String str,int n) {
        char[] strArr=str.toCharArray();
        int len=strArr.length;
        if(len<=0)
            return str;
        n=n%len;
        for(int i=0;i<n;i++){  //只控制循环次数
            char c=strArr[0];
            for(int j=0;j<len-1;j++) //拿出第一个,后面依次前移,复杂度O(n^2)
                strArr[j]=strArr[j+1];
            strArr[len-1]=c;
        }
        return new String(strArr);
    }

​

代码(字符切片):

class Solution {
    public String dynamicPassword(String password, int target) {
        return password.substring(target, password.length()) + password.substring(0, target);
    }
}

注:利用subString()方法 

代码(列表拼接):

class Solution {
    public String dynamicPassword(String password, int target) {
        StringBuilder res = new StringBuilder();
        for(int i = target; i < password.length(); i++)
            res.append(password.charAt(i));
        for(int i = 0; i < target; i++)
            res.append(password.charAt(i));
        return res.toString();
    }
}

注:利用append()方法

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值