剑指offer:左旋转字符串

博客介绍用字符串模拟汇编语言中循环左移(ROL)指令的运算结果。思路是按移位位数将字符串分两部分,分别内部翻转,再对整个字符串翻转。还提到与字符串相关代码要注意输入空指针崩溃和内存访问越界问题,代码中需检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

本题和https://blog.youkuaiyun.com/orangefly0214/article/details/87299858翻转字符串序列是一样的,都是采用两次翻转来实现最终整个字符串的翻转效果。

思路:

1.首先,按照需要移位的位数将字符串分为前后两部分,并分别对这两部分实现内部翻转。
 2.对整个字符串序列进行一次大翻转。

比如abcdefg左移2位,则先将字符串分为 ab和cdefg,对这两个子字符串进行翻转,得到bagfedc.
再对这个结果进行一次翻转,得到最终的序列cdefdab.

注:与字符串相关的代码中我们需要注意的两点:

①输入空指针null时程序会崩溃。

②内存访问越界问题。

所以在代码中也需要对这些问题进行检查。

实现:

public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str.trim().length()==0){
            return str;
        }
        char[] strs=str.toCharArray();
        if(str.length()>0&&n>0&&n<str.length()){
            int start1=0,end1=n-1,start2=n,end2=strs.length-1;
            //先对两部分子字符串分别进行翻转
            reverse(strs,start1,end1);
            reverse(strs,start2,end2);
            //再对整个字符串进行一次翻转
            reverse(strs,0,strs.length-1);
        }
        return new String(strs);
    }
    private void reverse(char[] strs, int begin, int end) {
        while(begin<end){
            char temp=strs[begin];
            strs[begin]=strs[end];
            strs[end]=temp;
            begin++;
            end--;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值