• 剑指43.左旋转字符串


    题目描述

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

    思路

    思路1:字符串翻转的应用。左旋转可以看成是字符串翻转两次,例子——输入字符串abcdefg,左移2位

               第一次翻转整个字符串,让每个子序列处于合适的位置;例如,abcdefg → gfedcba

               第二次翻转两个子序列,消除第一次翻转对每个子序列内部位置的影响。例如上一步得到gfedcba,对两个子序列分别翻转,gfedc→cdefg、ba→ab,再合并起来 cdefgab。

    Note:这两次翻转也可以调换顺序,第一次分别翻转两个子序列,得到bagfedc;第二次翻转整个字符串得到cdefgab。

    思路2:截取字符串。

    注意:本题的边界条件!!n 可能 大于字符串的长度,因此稳妥起见传入的 n 先做 n = n % str.length();
     

    解法1.1(手写reverse())

    public class Solution {
        public String LeftRotateString(String str,int n) {
            if (str == null || str.length() ==0 || n <= 0) // 最全的边界条件
                return str;
            n = n % str.length();
            char[] chars = str.toCharArray();
            // 第一种翻转顺序
            reverse(chars,0,n-1);
            reverse(chars,n,str.length()-1);
            reverse(chars,0,str.length()-1);
            // 第二种翻转顺序
            /*reverse(chars,0,str.length()-1);
            reverse(chars,0,str.length()-n-1);
            reverse(chars,str.length()-n,str.length()-1);*/
            return String.valueOf(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--;
            }
        }
    }

    解法1.2(调用reverse())

    public class Solution {
    // 版本1:先对整个字符串翻转,再分别翻转两个子字符串
        public String LeftRotateString(String str,int n) {
            if (str.length() == 0)
                return "";
            n = n % str.length();
            StringBuilder flipStr = new StringBuilder(str).reverse();// 第一次对整个字符串进行翻转
            String str1 = flipStr.substring(0,str.length() - n); //左闭右开
            String str2 = flipStr.substring(str.length() - n);   //默认到字符串最后
            return new StringBuilder(str1).reverse().append(new StringBuilder(str2).reverse()).toString(); // 第二次分别翻转
        }
        // 版本2:先分别翻转两个子字符串,再对整个字符串翻转
        public String LeftRotateString(String str,int n) {
            if (str.length() == 0)
                return "";
            n = n % str.length();
            String str1 = str.substring(0,n);
            String str2 = str.substring(n);
            return new StringBuilder(str1).reverse().append(new StringBuilder(str2).reverse()).reverse().toString();
        }
    }

    解法2

    public class Solution {
        public String LeftRotateString(String str,int n) {
            if (str.length() == 0)
                return "";
            n = n % str.length();
            return str.substring(n) + str.substring(0,n);
        }
    }

    自己写的弱鸡添加法

    public class Solution {
        public String LeftRotateString(String str,int n) {
            if (str.length() == 0)
                return str;
            StringBuilder sb = new StringBuilder();
            for (int i = n; i < str.length(); i++)
                sb.append(str.charAt(i));
            for (int i = 0; i < n; i++)
                sb.append(str.charAt(i));
            return sb.toString();
        }
    }
  • 相关阅读:
    jdk jre jvm 关系
    深入Android开发之--理解View#onTouchEvent
    使用android.view.TouchDelegate扩大View的触摸点击区域
    Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习
    BitMap 内存使用优化
    android——屏幕适配大全(转载)
    android——ImageLoader添加缓存
    android——混淆打包
    android——仿微拍贷滑动圆形菜单
    android——使用自带录屏工具进行屏幕录像
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13563346.html
Copyright © 2020-2023  润新知