1.字符串:子串就是字符串中任意个连续的字符组成的子序列。例:有字符串String str = “abbbcdfee”,那么“a”,“ab”,"abb","bbb","cdf"等都是字符串str的子床,重点是连续“ac”由字符“a”与“c”组成,但是“ac”不是str的子串,另:“”也是str的子串,即str的有一个空子串,且空子串所有字符串的一个子串。
2,二分查找:
递归二分查找:
public int recursiveBinarySearch(int[] a, int target) { int hi = a.length - 1; int mid = hi/2; int middleValue = a[mid]; int[] tmp; if (target > middleValue) { tmp = Arrays.copyOfRange(a, mid + 1, hi); } else if (target < middleValue) { tmp = Arrays.copyOfRange(a, 0, mid - 1); } else { /** * 此处有问题middleValue转为整型对象Integer,虽然还是100,但是内存地址与Arrays.asList(a)中的100对象地址不一样,返回值会为-1 */ return Arrays.asList(a).indexOf(middleValue); } return recursiveBinarySearch(tmp, target); }此代码效率低下,同时会生成大量的中间数组,带改进。
常规二分查找:
public int binarySearch(int[] a, int target) { int lo = 0; int hi = a.length - 1; while (lo <= hi) { int mid = lo + ( hi - lo) /2; if (target < a[mid]) { hi = mid - 1; } else if (target > a[mid]) { lo = mid + 1; } else { return mid; } } return -1; }
这个方法是二分查找的正确姿势
追加正确姿势的递归二分查找:
public int recursiveBinarySearch(int[] a, int target, int start, int end) { int mid = start + (end - start) / 2; if (target > a[mid]) { return recursiveBinarySearch(a, target, mid + 1, end); } else if (target < a[mid]) { return recursiveBinarySearch(a, target, start, mid - 1); } else { return mid; } }