左旋轉字符串

題目描述

彙編語言中有一種移位指令叫作循環左移(ROL),如今有個簡單的任務,就是用字符串模擬這個指令的運算結果。對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。
例如,字符序列S=」abcXYZdef」,要求輸出循環左移3位後的結果,即「XYZdefabc」。是否是很簡單?OK,搞定它!java

思路

三次翻轉。
時間複雜度O(n),空間複雜度O(1)。數組

代碼

import java.util.Arrays;
public class Solution {
    private void reverse(char[] cs, int low, int high) {
        char tmp;
        // 折半時須要包括等於,以兩個數爲例,須要選取下標=1
        for(int i = low; i <= (low + high) / 2; i++) {
            tmp = cs[i];
            cs[i] = cs[high - i + low];
            cs[high - i + low] = tmp;
        }
    }
    
    public String LeftRotateString(String str, int n) {
        if(str == null || str.length() == 0 || n < 1)    return str;
        char[] cs = str.toCharArray();
        reverse(cs, 0, n-1);
        reverse(cs, n, str.length() - 1);
        reverse(cs, 0, str.length() - 1);
        return String.valueOf(cs);
    }
}

筆記

直接返回cs.toString()返回的是"[C@7d4991ad"一類的字符串,[C表示char數組類型。
char數組類型的元素直接調用toString()函數,實際調用的是從Object類繼承的toString()函數。
Object類toString函數源碼:函數

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

除了使用String.valueOf函數返回,還可使用:code

return new String(cs);

實際就是String.valueOf的源碼:繼承

public static String valueOf(char data[]) {
        return new String(data);
    }
相關文章
相關標籤/搜索