您好,登錄后才能下訂單哦!
匯編語言中有一種移位指令叫做循環(huán)左移(ROL),現(xiàn)在有個簡單的任務,就是用字符串模擬這個指令的運算結果。對于一個給定的字符序列S,請你把其循環(huán)左移K位后的序列輸出。例如,字符序列S=”abcXYZdef”,要求輸出循環(huán)左移3位后的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
代碼
解法一
最直觀的方式,依次將需要移位的字符移動至最后,但是每個字符都需要移動數(shù)組的長度-1,如果數(shù)組的長度是n,需要移k位,則總共需要移動 k * (n - 1)
public static String leftRotateString(String str, int n) { if (Strings.isNullOrEmpty(str)) { return str; } if (n < 0 || n >= str.length()) { return str; } char[] strArray = str.toCharArray(); while (n-- > 0){ // 直接交換的方式,將需要移位的部分通過交換n-1次向左移動 // 比如abcde,要移動2位,即cdead // 1. 將a移動至最后,此時是bcdea // 2. 將b移動至最后,此時是cdeab for (int i = 0; i < strArray.length - 1; i++) { swap(strArray, i, i + 1); } } return new String(strArray); } private static void swap(char[] str, int i, int j) { char temp = str[i]; str[i] = str[j]; str[j] = temp; }
解法二
借助字符串的反轉,比如“ab”對應“ba”,“xyz”對應“zyx”,總共需要三步即可得到期望想過
public static String leftRotateString2(String str, int n) { if (Strings.isNullOrEmpty(str)) { return str; } if (n < 0 || n >= str.length()) { return str; } char[] strArray = str.toCharArray(); // 借助反轉,分三步 // 1. 反轉要移位的部分 // 2. 反轉其余部分 // 3. 整體反轉 reverse(strArray, 0, n - 1); reverse(strArray, n, strArray.length - 1); reverse(strArray, 0, strArray.length - 1); return new String(strArray); } /** * 反轉字符串,兩端依次進行交換即完成反轉 * @param str * @param start * @param end */ private static void reverse(char[] str, int start, int end) { while (start < end) { swap(str, start, end); start++; end--; } } private static void swap(char[] str, int i, int j) { char temp = str[i]; str[i] = str[j]; str[j] = temp; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。