最近在看面試題的時候發現,一些基礎的算法都記不住了,只是能大概說出個原理….為了加深記憶,這里對一些簡單的算法題進行一個歸納。
下面的代碼主要解決的問題是:給定一個字符串str和一個整數i,i代表字符串中某一個元素的下標,將str[0..i-1]移到這個元素的右側,將str[i+1..len(str)-1]移到這個元素的左側。(要求:時間復雜度為O(N),空間復雜度為O(1))
測試用例樣例: 輸入:”abcde”, 2 預期結果: deabc
下面是java實現:
/** * Created by Flynnon on 17-2-27. * 問題:給定一個字符串str和一個整數i,i代表字符串中某一個元素的下標,將str[0..i-1]移到這個元素的右側,將str[i+1..len(str)-1]移到這個元素的左側。 * 要求:時間復雜度為O(N),空間復雜度為O(1) */public class Test { /** * 將一個數組以某一元素分界,將這個元素之前的部分與之后的部分互換位置 * 主要思路: 將之前的部分與之后的部分分別逆序,再將整體逆序即可 * @param str 要進行操作的字符串 * @param i 作為分界線的元素的下標 * @return 轉化之后生成的字符串 */ public static String replaceBeginAndEnd(String str, int i) { if (str == null || i < 0 || str.length() <= i) { return str; } char[] chars = str.toCharArray(); reverseCharArray(chars, 0, i - 1); reverseCharArray(chars, i + 1, chars.length - 1); reverseCharArray(chars, 0, chars.length - 1); return new String(chars); } /** * 用來翻轉一個數組的某一部分 * @param charArray 要進行操作的數組 * @param begin 要翻轉的部分第一個元素的下標 * @param end 要翻轉的部分最后一個元素的下標 */ public static void reverseCharArray(char[] charArray, int begin, int end) { char tmp; while (begin < end) { tmp = charArray[begin]; charArray[begin] = charArray[end]; charArray[end] = tmp; begin++; end--; } } public static void main(String[] args) { String str = "abcde"; System.out.PRintln(replaceBeginAndEnd(str, 2)); }}下面是測試用例及結果,與預期結果一致。

新聞熱點
疑難解答