Leetcode简单题:剑指 Offer 58 - II. 左旋转字符串

观看提示:

        该博客因笔者水平能力不高,因此该博客质量低。
        该博客是观看B站up主[吴师兄学算法]视频编写的。

  剑指 Offer 58 - II. 左旋转字符串

  • 要求:
    • 提供:给个字符串,给个数字。
    • 效果:以数字为字符串的元素下标,元素下标前的字符移动到尾部。
  • 示例
    • 输入: s = "abcde", n = 2
      输出: "cdeab"
  • 思路
    • 重点-怎么交换元素位置?
      • 双指针可以让字符串的元素左右交换位置。
      • 字符串使用双指针前的准备:
        • 获取字符串的长度,
          • int length = s.length();  
        • 把字符串转换为字符数组的形式
          • char[] chars = s.toCharArray();
    • 重点-交换元素位置的具体做法:
      • 以s = "abcde", n = 2 为例子。
      • 第一次交换:
        • 完成效果:s="edcba",
        • 说明:只完成n下标左右边元素交换,但还有排序问题。
      • 第二次交换:
        • 完成效果:s="cdeba",
        • 说明:解决了n下标左边排序问题。
      • 第二次交换:
        • 完成效果:s="cdeab",
        • 说明:解决了n下标右边排序问题。
    • 难点-控制第N次交换的头尾指针:
      • 第一次交换:
        • 头指针一定从0开始,
        • 尾指针一定从length - 1开始。
      • 第二次交换:
        • 头指针一定从0开始,
        • 尾指针从n下标的左+1位置,即 length -1 - n 位置开始。
      • 第三次交换:
        • 头指针从n下标的右+1位置,即 length - n 位置开始。
        • 尾指针一定从length - 1开始。
    • 难点-交换元素位置的方法(伪代码):
    // 以 s = "abcde" k=2 的第一次交换为例
    
    // 第一次交换传进来参数:变成数组的chars, 头指针=0, 尾指针=3
    private void reverse(char[] chars, int 头指针, int 尾指针) {
        
        while (头指针 < 尾指针) {
            // 暂时保存首位置的字符
            char 临时变量 = chars[头指针];
    
            // 首位置得到尾字符
            chars[头指针] = chars[尾指针];
    
            // 尾位置得到首字符
            chars[end] = temp;
            
            // 头尾指针分别向右和向左移动
            头指针++;
            尾指针--;
    
    }    
//完整代码来自[吴师兄学算法]

class Solution {
    public String reverseLeftWords(String s, int n) {

        // 双指针对字符串使用前的准备
        int length = s.length();
        char[] chars = s.toCharArray();
        
        // 第一次交换    
        reverse(chars, 0, length - 1);
        
        // 第二次交换   
        reverse(chars, 0, length - n - 1);
        
        // 第三次交换   
        reverse(chars, length - n, length - 1);
        
        // 返回字符串结果
        return new String(chars);
    }
    
    // 双指针交换的具体方法
    private void reverse(char[] chars, int start, int end) {
        
        while (start < end) {
            char temp = chars[start];
			
            chars[start] = chars[end];
            
            chars[end] = temp;

            start++;
            end--;
        }
    }
    
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值