直觉与书本知识冲突,是最好的学习机会。必须抓住这种机会。
[344] 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
public void reverseString(char[] s) {
// 采用双指针 并且当交换的数据相等时,不做交换
for (int i = 0, j = s.length - 1; i < s.length / 2 && j >= s.length / 2; i++, j--) {
if (s[i] != s[j]) {
swap(s, i, j);
}
}
}
public static void swap(char[] a, int i, int j) {
char temp = a[i];
a[i] = a[j];
a[j] = temp;
}
整数反转
public int reverse(int x) {
long res = 0;
while (x != 0) {
res = res * 10 + x % 10;
x /= 10;
}
return (int) res == res ? (int) res : 0;
}
最长公共前缀
// 先取第一个字符串当作它们的公共前缀
// 然后找出他和第2个字符串的公共前缀,然后再用这个找出的公共前缀分别和第3个,第4个……判断
public String longestCommonPrefix(String[] strs) {
if (strs == null) {
return "";
}
String pre = strs[0];
int i = 0;
while (i < strs.length) {
//不断的截取
while (strs[i].indexOf(pre) != 0) {
pre = pre.substring(0, pre.length() - 1);
}
i++;
}
return pre;
}
数组
数组拥有非常高效的随机访问能力,只要给出下标,就可以用常量时间找到对应元素。有一种高效查找元素的算法叫作二分查找,就是利用了数组这个优势。
至于数组的劣势,体现在插入和删除元素方面。由于数组元素连续紧密地存储在内存中,插入、删除元素都会导致大量元素被迫移动,影响效率。
总的来说,数组所适合的是读操作多、写操作少的场景。
package chapter2.part1;
/**
* Created by weimengshu on 2018/8/24.
*/
public class MyArray {
private int[] array;
private int size;
public MyArray(int capacity) {
this.array = new int[capacity];
size = 0;
}
/**
* 数组插入元素
*
* @param element 插入的元素
* @param index 插入的位置
*/
public void insert(int element, int index) throws Exception {
// 判断访问下标是否超出范围
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("超出数组实际元素范围!");
}
// 如果实际元素达到数组容量上限,数组扩容
if (size >= array.length) {
resize();
}
// 从右向左循环,逐个元素向右挪一位。
for (int i = size - 1; i >= index; i--) {
array[i + 1] = array[i];
}
// 腾出的位置放入新元素
array[index] = element;
size++;
}
/**
* 数组扩容
*/
public void resize() {
int[] arrayNew = new int[array.length * 2];
// 从旧数组拷贝到新数组
System.arraycopy(array, 0, arrayNew, 0, array.length);
array = arrayNew;
}
/**
* 数组删除元素
*
* @param index 删除的位置
*/
public int delete(int index) throws Exception {
// 判断访问下标是否超出范围
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("超出数组实际元素范围!");
}
int deletedElement = array[index];
// 从左向右循环,逐个元素向左挪一位。
for (int i = index; i < size - 1; i++) {
array[i] = array[i + 1];
}
size--;
return deletedElement;
}
/**
* 输出数组
*/
public void output() {
for (int i = 0; i < size; i++) {
System.out.println(array[i]);
}
}
public static void main(String[] args) throws Exception {
MyArray myArray = new MyArray(4);
myArray.insert(3, 0);
myArray.insert(7, 1);
myArray.insert(9, 2);
myArray.insert(5, 3);
myArray.insert(6, 1);
myArray.insert(8, 5);
myArray.delete(3);
myArray.output();
}
}