怎么港,前几天内推电面了美团跟阿里的开发测试,我想象的应该是重点问质量保障,简单问问java知识就行了,实际是大大的丢脸。后边跟人了解了一下,当前没有专职测试,都是开发自测,开发测试帮助开发进行质量保障,对java的要求跟开发一样 一样的。互联网果然跟我狼厂不一样,虽然我狼厂也一直在进步,但是还是差距蛮大。知耻而后勇吧,先把题目刷起来。
刷题思路,先剑指offer刷完,接着是leetcode,零散时间补充其他知识。原因是最欠缺动手能力。先把题目刷起来;
今天第一刷,单例模式,单例模式很多,从最简单的角度考虑,不学习太多,先学习静态内部类方法的实现,静态内部类不会在单例加载时就加载,而是在调用getInstance()方法时才进行加载,达到了类似懒汉模式的效果,而这种方法又是线程安全的。
public class Singleton {
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
public Singleton getinstance() {
return SingletonHolder.instance;
}
}
今天第二题数组中重复的数字
解题思路,以(2, 3, 1, 0, 2, 5) 为例,先把数组第一个值2跟自己的下标0比较不相等,那么2与1相比较(1的下标是2),两者不相等然后交换位置,变成了1 3 2 0 2 5。
然后比较1与自己的下标0不相等,那么1与3比较(3的下标是1),不相等交换位置变成3,1,2,0,2,5
然后3与自己的下标0 不相等,那么3根0比较(0的下标是3),不相等于是交换成0,1,2,3,2,5。
再次比较0 根 0的下标发现相等,比较1根1的下标也相等,同理 2 3都相等,第五个下标是2不相等,而此时下标2 的地方已经存在2了,那么此时就找到重复值了
package com.lyc.dataautest;
public class Duplicate {
public static void swap(int[] num,int i,int j) {
int t = num[i];
num[i] = num[j];
num[j] = t;
}
public static boolean duplicate(int[] num) {
if(num==null) return false;
System.out.println("length is:"+num.length);
for(int i=0; ;i++) {
while(num[i]!=num[num[i]] && num[i] != i) {
swap(num,i,num[i]);
}
if(num[i] == num[num[i]] && num[i] != i) {
System.out.println("i is:"+num[i]);
return true;
}
}
return false;
}
public static void main(String[] args) {
int[] arr = {2,3,1,0,2,5};
duplicate(arr);
}
第三题 矩形覆盖的问题
我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种方法?
解法参考https://www.cnblogs.com/csbdong/p/5689674.html
解释一下算法如果有n个矩形,如果第一步选择竖着放置2*1的矩形,其实图形没有变化,剩下2*(n-1)个方法。如果选择横着放,显然啊第二个也必须横着放,那么就剩下2*(n-2)个算法,于是问题就变成了菲波齐纳算法 f(n-1) + f(n-2) = f(n)
public int RectCover(int n) {
if (n <= 2) return n;
int pre2 = 1, pre1 = 2;
int result = 0;
for (int i = 3; i <= n; i++) {
result = pre2 + pre1;
pre2 = pre1;
pre1 = result;
}
return result;
}