JAVA基础算法练习(5):行星碰撞

 ------文章底部代码分享

一、题目

标题:行星碰撞
给定一个整数数组 asteroids,表示在同一行的行星。

对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。

找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

 

示例 1:

输入:asteroids = [5,10,-5]
输出:[5,10]
解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞。
示例 2:

输入:asteroids = [8,-8]
输出:[]
解释:8 和 -8 碰撞后,两者都发生爆炸。
示例 3:

输入:asteroids = [10,2,-5]
输出:[10]
解释:2 和 -5 发生碰撞后剩下 -5 。10 和 -5 发生碰撞后剩下 10 。

         要求于下图方法中编写;

二、解题

2.1

        第一步记录数组长度,避免做判断时太过杂乱;

        然后编写一个 while 循环没有给出 break 时进行无限循环;因为一次循环并不一定可以计算完所有会发生碰撞的行星,当后面两颗行星碰撞时,前面被判断为不会发生碰撞的行星可能会与后面的行星碰撞 )

        在循环内部再写一个循环,用于寻找会发生碰撞的两颗行星;

        因为一旦两个行星相乘为整数就代表两颗行星的方向是相同的不会发生碰撞,故需要改变坐标,因为当左边的行星向左边( 小于 0 )运行的时候也不会发生碰撞故也需要改变坐标,当某一个数等于 0 时代表是一颗已经撞毁的行星,故也需要更变坐标;

        如果 next 坐标上代表的行星已被撞毁,则向后移动一位 next 坐标;

        否则都是将 next 赋值到 prior 坐标,在向后移动一位坐标;

JAVA基础算法练习(5):行星碰撞_第1张图片

 2.2

        增加一条判断,如果 next 坐标进行增加后会导致越界则直接跳出循环,又因为如果判断可以碰撞的行星时 next 坐标就越界了,则表示所有的行星都不会发生碰撞,故增加一条对最外层循环跳出的判断;

JAVA基础算法练习(5):行星碰撞_第2张图片

 2.3

        如果没有发生越界,就代表有行星发生了碰撞,故需要判断是哪一颗行星被撞毁;

JAVA基础算法练习(5):行星碰撞_第3张图片

 2.4

        因为题目要求是不输出撞毁的行星,故需要将最后所得的数组进行转换为集合也可以直接创建一个集合,通过数组遍历将不为 0 的元素 add 进集合 ),再将集合中为 0 的数据给删除,最后将集合转换到一个新数组;( 注意:JAVA 的集合当中是不存在 int 型的不能像其他类型那样直接转换 )

        最后将得到的新数组返回;

JAVA基础算法练习(5):行星碰撞_第4张图片

三、代码分享

class Solution {
    public static int[] asteroidCollision(int[] asteroids) {
        int len = asteroids.length;
        while (true){
            int prior = 0;
            int next = 1;
            while ( asteroids[prior] * asteroids[next] >= 0 || asteroids[prior] < 0 ){
                if ( next + 1 == len ){
                    next++;
                    break;
                }
                if ( asteroids[next] == 0 ){
                    next++;
                    continue;
                }
                prior = next++;
            }
            if ( next == len)
                break;
            else if ( Math.abs(asteroids[prior]) > Math.abs(asteroids[next]) ){
                asteroids[next++] = 0;
            }else if ( Math.abs(asteroids[prior]) < Math.abs(asteroids[next]) ){
                asteroids[prior] = 0;
                prior = next++;
            }else {
                asteroids[prior] = asteroids[next] = 0;
                prior = ++next;
                next++;
            }
        }
        List list = Arrays.stream(asteroids).boxed().collect(Collectors.toList());
        for ( int i = 0; i < list.size();  ){
            if ( list.get(i) == 0 ){
                list.remove(i);
            }else i++;
        }

        int[] array = list.stream().mapToInt(arr -> arr).toArray();
        return array;
    }
}

        测试通过;

JAVA基础算法练习(5):行星碰撞_第5张图片

 

 

你可能感兴趣的:(JAVA算法练习,java)