实现Singleton模式
Singleton模式:只能生成一个实例的类,就是说只new一次。
解法:
1)不考虑多线程,只要判断类实例时否为null,为null就new,不为null就是已经有类实例了,不执行其他操作就好
2)考虑多线程,当类实例为null,加一个同步锁,保证同一时间只有一个线程执行实例化类的代码(即new操作)
3)最优:定义私有嵌套类,程序需要实例类,即定义了类实例的对象后(未初始化),直接调用嵌套类去生成实例(即new操作),这样子提高了空间效率
找数组中重复的数字
一个长度为n的数组a[n],不知道哪些数字重复,重复了几次。
1)先排序,然后遍历,下标跟值不对应的就是重复的,时间复杂度O(nlogn)
2)定义一个哈希表,然后遍历,根据key-value是否对应可以得到重复的,时间复杂度O(n),但是需要一个大小为O(n)的哈希表为代价
3)最优:
1、定义一个for循环遍历数组a[n]
2、i != a[i]:当当前下标对应的值不等于下标
A:a[i] == a[a[i]] 当前下标对应的值等于下标为当前下标对应的值的值,即为重复
B:a[i] != a[a[i]] 交换二者位置
i == a[i],执行步骤3
3、i++,重复步骤2
int n = 10000;
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
while (i != a[i]){
// 当当前下标i对应的值 == 下标为[当前下标i对应的值]的值
if (a[i] == a[a[i]]){
System.out.println(a[i]+"为重复值");
return;
}
// 交换位置
int temp = a[i];
a[i] = a[temp];
a[temp] = temp;
}
}