最近在看面试题的时候发现,一些基础的算法都记不住了,只是能大概说出个原理….为了加深记忆,这里对一些简单的算法题进行一个归纳。
下面的代码主要解决的问题是:给定一个字符串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)); }}下面是测试用例及结果,与预期结果一致。
新闻热点
疑难解答