前几天组长面试时让面试者做这个算法题,我就自己和同事一起做了这个题目,难度做面试的话正好,我们两个做的方法不一样,但是最终的结果都是一致的,时间差不多20分钟,下面就一起看看这个题目吧
题目:
1
1、1
2、1
1、2、1、1
1、1、1、2、2、1
举个例子:第一行是1 ,那么第二行解释第一行为1个1,第三行对第二行数组的解释:2个1,如果上一行相邻数字相同,第一个代表数量的数字就会++,一直到下一个不同或者到这一行的结尾。
那么编写程序,根据输入的行数输出第几行的数字列表.
程序:
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
if(num==1){
System.out.println(1);
return;
}
if(num<=0){
return;
}
//同事的解法,就是用指针,而且把结果都存储起来了
long startTime=System.currentTimeMillis();
List<String> listW = new ArrayList<>();
listW.add("1");
for (int i = 1; i <=num ; i++) {
String s = listW.get(i - 1);
int left = 0;
int right = 0;
char[] c = s.toCharArray();
char leftChar = c[left];
StringBuffer sb = new StringBuffer();
a: while (right != s.length()) {
right++;
if (right == s.length()) {
int size = right - left;
sb.append(size);
sb.append(String.valueOf(c[left]));
leftChar = c[left];
continue a;
}
char now = c[right];
if (now != leftChar) {
// 开始统计数据, 终止
int size = right - left;
sb.append(size);
sb.append(String.valueOf(c[left]));
left = right;
leftChar = c[left];
}
}
listW.add(sb.toString());
}
long endTime=System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime)+"ms");
//我的解法,只考虑上一行和下一行,两个list切换,
startTime=System.currentTimeMillis();
List<Integer> list = new ArrayList<>();
list.add(1);
for (int i = 1; i <=num ; i++) {
List<Integer> list1 = new ArrayList<>();
int currNum =1;
int currValue = list.get(0);
if(i==1){
continue;
}
for(int j =0;j<list.size();j++){
if(j+1<list.size() && currValue==list.get(j+1)){
currNum++;
} else{
list1.add(currNum);
list1.add(currValue);
currNum=1;
if(j+1<list.size()){
currValue=list.get(j+1);
}
}
}
list = list1;
}
endTime=System.currentTimeMillis();
System.out.println("执行时间:"+(endTime-startTime)+"ms");
}
下面就是执行时间图,以50行为例,我的时间是他的三分之一,但是他这个想法是通用的,很像以前在大学学的给你一个数组,让你算区间最大和的那个算法题