多行数字,下一行数是上一行数字的解释(忘了题目了)

前几天组长面试时让面试者做这个算法题,我就自己和同事一起做了这个题目,难度做面试的话正好,我们两个做的方法不一样,但是最终的结果都是一致的,时间差不多20分钟,下面就一起看看这个题目吧

题目:

1
11
21
1211
111221

举个例子:第一行是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行为例,我的时间是他的三分之一,但是他这个想法是通用的,很像以前在大学学的给你一个数组,让你算区间最大和的那个算法题
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值