使数组全为奇数的问题 | 豆包MarsCode AI刷题

85 阅读4分钟

这道题主要给我的感受就是,不要复杂化问题,从最基础、最核心的地方入手即可。

问题描述

小U手中有一个包含 N 个整数的数组 A,它的编号从 0 到 N - 1。小U可以执行一种操作:在任意时刻选择数组中任意奇数索引 i 的元素 A[i] 并将其删除。也就是说,用户可以从数组中删除所有位于奇数索引处的元素。

你的任务是帮助小U判断是否可以通过若干次这样的操作使得数组 A 中剩下的所有元素都是奇数。如果可以实现,则返回 1;否则,返回 0。

例如:给定数组 A = [3, 5, 2],第一次操作中可以删除 A[1],数组变为 [3, 2]。接下来,再删除 A[1],数组变为 [3]。此时,数组中的所有元素都是奇数,因此返回 1。

测试样例:

样例1:

输入:n = 3,A = [3, 5, 2]
输出:1

样例2:

输入:n = 4,A = [2, 4, 6, 8]
输出:0

问题分析

看题目说的那么复杂,实际上我们只需要关注第一个数是否为奇数就可以了,因为后面的数可能会因为在它前面的数被删除时索引发生变化,但第一个数的索引是永久不变的,而且它的索引是偶数,无法被删除。

【上面这个是我在写这篇文章的时候突发奇想的做法。下面我会展示出三种做法,分别是我的第一版代码和写文章突发奇想的代码】

第一版代码

这版代码是我在刷题的时候写的。

大致思路是这样的:先把数组转换为list数据结构类型以便于通过index删除某个元素;接着是循环list,删除index为1的元素直到list中只剩下最后一个元素;这时候再进行奇数判断就可以了。

但是后来细想,这种方法需要一直删除元素,直到剩下最后一个,时间上比较麻烦。

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static int solution(int n, int[] A) {
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            list.add(A[i]);
        }
        while (list.size() >= 2) {
            list.remove(1);
        }
        return list.get(0) % 2 == 0 ? 0 : 1;
    }

    public static void main(String[] args) {
        System.out.println(solution(3, new int[] { 3, 5, 2 }) == 1);
        System.out.println(solution(4, new int[] { 2, 4, 6, 8 }) == 0);
        System.out.println(solution(5, new int[] { 1, 3, 5, 7, 9 }) == 1);
    }
}

突发奇想的代码

思路遵循刚刚的问题分析。

我认为算是第一版代码的升级版,少了数据存储类型的转换。上面的做法是删除元素,直到剩下最后一个,仔细想一下,这个数组的元素一直以index为奇数的形式删除、且该元素删除后排在这个元素后面的元素都会进行自动补位,也就是说,不论怎么删除,最后剩下的都会是第一个元素。

模拟第一版代码,证实剩下的元素一定是第一个元素

这里我使用两个实例,第一个是solution(3, new int[] { 3, 5, 2 }),第二个是solution(4, new int[] { 2, 4, 6, 8 })

solution(3, new int[] { 3, 5, 2 })

  • 初始化list:[3, 5, 2]
  • list的size大于2,进入循环:
    • 第一次循环,删除5,list:[3, 2]
    • 第二次循环,删除2,list:[3]。由于list的size小于2,跳出循环。
  • 此时list.get(0)为3,为奇数,返回1。

solution(4, new int[] { 2, 4, 6, 8 })

  • 初始化list:[2, 4, 6, 8]
  • list的size大于2,进入循环:
    • 第一次循环,删除4,list:[2, 6, 8]
    • 第二次循环,删除6,list:[2, 8]。
    • 第二次循环,删除8,list:[2]。由于list的size小于2,跳出循环。
  • 此时list.get(0)为2,为偶数,返回0。

看,剩下的元素就是索引为0的元素

所以最后代码被简化成这个样子👇

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static int solution(int n, int[] A) {
        return A[0] % 2 != 0 ? 1 : 0;
    }

    public static void main(String[] args) {
        System.out.println(solution(3, new int[] { 3, 5, 2 }) == 1);
        System.out.println(solution(4, new int[] { 2, 4, 6, 8 }) == 0);
        System.out.println(solution(5, new int[] { 1, 3, 5, 7, 9 }) == 1);
    }
}

这是不是可以算在钻漏洞...

当然,编译提交都可以成功。

小结

突发奇想,brainstorm还是很快乐的。

美美复习~~