抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

百词斩春招笔试编程题-数字压缩

今天上午刚起床发现已经快笔试了,果断开电脑,一共60分钟,3道编程题,没有什么性格测试也没选择题。。。出乎意外,但是状态不佳,第二道题快出来的时候,时间不够了。还是得吃东西啊。。。晚上想起,还是继续调试弄出来吧。

题目二:

给定一组1~7组成(包含1和7)的有序且非重复数字数组, 每个数字的字面值n表示一周里面的第n天, 要求按照如下规则压缩后, 输出压缩以后的描述:

1) 对于三个及三个以上的连续数字, 需要压缩成”起始-结束”的格式;

2) 对于三个以下的连续或不连续数字, 不需要压缩, 按照原样输出;

输入描述:

第一行整数n(1 <= n <= 7),代表数组长度

接下来n行,每行一个整数,代表数组中的一个元素

格式如下:

数组长度n

数组第1个数

数组第2个数

数组第n个数

输出描述:

按照题目要求压缩之后的数字序列, 序列的每一段之间使用英文逗号分隔, 输出为一行.

示例1

输入

 5
 1
 3
 4
 5
 7

输出

1,3-5,7

示例2

输入

 2
 1
 2

输出

1,2

以上为题目所有,看起来简单,也确实简单。但是一开始并未想好,加上牛客网的编程提交忘记是用的Scanner,试了好久,一直以为是main函数传参。。怎么说呢,糊涂了。

解法(关键在于将不确定的确定下来,再慢慢调试):

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int count = scanner.nextInt();
        int[] s = new int[count];

        for (int i = 0; i < s.length; i++) {
            if (scanner.hasNext()) {
                s[i] = scanner.nextInt();
            }
        }
//------------------以上为拿到输入数据--------下面的数据为模拟输入-------------------
//        int[] s = {1, 3, 4, 5, 6, 3, 4, 5, 7,8,9,10,7};

//数据长度小于3就直接输出吧,无论是不是连续的
        if (s.length < 3) {
            for (int l = 0; l < s.length; l++) {
                System.out.print(s[l]);
                if (l < s.length - 1) {
                    System.out.print(",");
                }
            }
            return;
        }
//如果数据有一定长度,题目说小于7,但是我这里没考虑上线,两个游标,一个是m 一个是n n是比m大一的数
        for (int m = 0; m < s.length; m++) {
            int n = m + 1;
//首先游标大1的那个 不能超过数组长度 并且连续代表差值为1
            if (n < s.length && s[n] - s[m] == 1) {
//这里使用递归来判断到底有多少个连续的数
                int times = isContinue(s, n, m, 0);
//int times=2; 这里是数据{1,3,4,5,7},也就是给定的测试数据的模拟实现,用于测试主框架是否正确 从0开始 3个连续的就只会到2 因为只需要4-3 5-4两组
                if (times >= 2) {
//如果有2次,说明就是3个连续的数。这里将m移动到最后一个数 可以看成end
                    m = m + times;
                    System.out.print(s[n - 1] + "-" + s[m]);
                }
            } else {
//如果当前位置连续的可能性为0 就直接输出吧
                System.out.print(s[m]);
            }
//逗号的判断,没什么好说的
            if (m != s.length - 1) {
                System.out.print(",");
            }
        }

    }

/**
* @s 数组本身
* @x 需要判断的元素起始位置 也就是前一个数
* @y x的后一个数
* @count 如果后面的数-前一位的数=1 则每次+1
*/    public static int isContinue(int[] s, int y, int x, int count) {
        if (y < s.length && s[y] - s[x] == 1) {
            count++;
            x++;
            y++;
//递归直到s[y] - s[x] != 1
            return isContinue(s, y, x, count);
        }
        return count;
    }
}

我想注释已经很清楚了。上图:

题目上的也是满足的。

经验总结:

这种题本身不用考虑太多,就是可能直接一次写下来会有很多问题无法拿捏,这时可以考虑用填空法,将未知的用确定的数字去填充,然后再去具体的实现细节。


本站由以下主机服务商提供服务支持:

0条评论

发表评论