补充【2错-2】左旋转字符串

测试用例>https://www.nowcoder.com/practice/12d959b108cb42b1ab72cef4d36af5ec?tpId=13&tqId=11196&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

日期 是否一次通过 comment
2019-02-09 20:20 Y 方法太蠢,字符串先切割再拼接
2019-02-10 12:20 N 很逗比:array.length、string.length()
2019-05-16 12:20 N 没看清左旋与右旋 & n%str.length()

题目:输出字符串循环左移n位结果
思路:

  1. 0 ~ n-1逆序;
  2. n ~ last 逆序;
  3. 整体逆序

1. 二分法

public class Solution {
    public String LeftRotateString(String str,int n) {
        if(n > str.length() || n < 0) {
            return str;
        }
        char[] array = str.toCharArray();
        reverse(array, 0, n-1);
        reverse(array, n, str.length()-1);
        reverse(array, 0, str.length()-1);
        
        return new String(array);
    }
    
    private void reverse(char[] array, int sta, int end) {
        
        while(sta < end) {
            char temp = array[sta];
            array[sta++] = array[end];
            array[end--] = temp;
        }
    }

}

扩展

  1. 输出右移:
    改为先整体逆序,再分别 0 ~ n-1 、 n-1 ~ last逆序

  2. 英文句子按单词逆序:
    改为先整体逆序,再通过寻找空格依次确定单词的起点和终点,并分别逆序
    (代码来源:https://www.cnblogs.com/edisonchou/p/4823706.html)

public static string ReverseSentense(string sentense)
    {
        if (string.IsNullOrEmpty(sentense))
        {
            return null;
        }

        char[] array = sentense.ToCharArray();
        int start = 0;
        int end = array.Length - 1;

        // Step1.先翻转整个句子
        Reverse(array, start, end);
        // Step2.再翻转句中的每个单词
        start = end = 0;
        while (start < array.Length)
        {
            if (array[start] == ' ')
            {
                start++;
                end++;
            }
            else if (end == array.Length || array[end] == ' ')
            {
                Reverse(array, start, --end);
                start = end + 1;
                end++;
            }
            else
            {
                end++;
            }
        }

        return new string(array);
    }

你可能感兴趣的:(补充【2错-2】左旋转字符串)