java - n 零填充数组是一个 如果其数组参数是 n 零填充,则该函数返回 true

标签 java arrays

如果数组包含两个或多个非零元素,并且恰好有 n 个零分隔所有相邻的非零元素(如果删除零),则该数组被定义为 n 零填充。例如,数组 {1, 0, 0, 18, 0, 0, -8, 0, 0} 是 2 零填充的,因为 1 和 18 之间有两个零,18 和 18 之间有两个零。 -8,这说明了所有非零元素。数组 {0, 1, 0, 0, 0, 6, 0, 8, 0, 0, 4} 不是 2-0 填充的,因为 1 和 6 之间有 3 个 0,而 6 之间只有 1 个 0和 8 使用以下签名编写名为 isNZeroPacked 的函数 boolean isNZeroPacked(int[] a, int n) 如果其数组参数是 n 零压缩的,则该函数返回 true(请注意,n 作为函数的参数之一传递

示例

  1. {0, 0, 0, 2, 0, 2, 0, 2, 0, 0} n=1 ans => 正确 || 1; 因为正好 1 个零分隔数组的所有非零元素

  2. {12, 0, 0, 0, 0, 0, 0, 0, -8} n=7 答案=真|| 1 因为正好有 7 个零分隔数组的所有非零元素

  3. {0, 0, 0, 0, 5, 0, 0, 4, 0, 0, 6} n=2 答案=真|| 1 因为正好有 2 个零分隔数组的所有非零元素

  4. {0, 0, 0, 0, 5, 0, 0, 4, 0, 0, 0, 6} n=2 答案=假|| 0 因为4和6之间有3个0。

  5. {0, 0, 0, 0, 5, 0, 4, 0, 0, 6} n=2 答案=假|| 0 因为5和4之间只有一个零。

  6. {0, 0, 0, 0} n=3 答案=假0 因为数组必须至少有两个非零元素

  7. {0, 0, 1, 0, 0} n=2 答案=假|| 0 因为数组必须至少有两个非零元素

注意:数组开头和结尾的零应该被忽略。我的解决方案在这里,任何更短和更简单的代码都值得赞赏

 private static boolean isNzeroPack(int[] arr, int n) {

        boolean firstIf = false;
        boolean secondIf = false;
        boolean satisfied=false;

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] != 0) {
                for (int j = i, k = 1; j < arr.length; k++, j++) {
                    if (i - k >= 0 && !firstIf && arr[i - k] != 0) {
                        if (j - i != n) {
                            return false;
                        } else {
                            firstIf = true;
                        }
                    }
                    if (((j + 1) < arr.length) && !secondIf && (arr[j + 1] != 0)) {
                        if (j - i != n) {
                            return false;
                        } else {
                            secondIf = true;
                        }

                    }
                }
                satisfied = true;
            }
            firstIf = false;
            secondIf = false;

        }
        return satisfied;
    }

最佳答案

我使用正则表达式研究了一些可能的解决方案:

  1. 获取数组的字符串表示形式:

    来自:{ 0 , 0 , 0 , 2 , 0 , 2 , 0 , 2 , 0 , 0 };

    致:0002020200

  2. 从字符串中删除前导零和尾随零。

    所以,到目前为止我们得到的是:20202

  3. 现在您必须选择:

    3.1。如果结果字符串长度为 < 2 返回 false。这符合两个非零元素的要求。

    3.2。如果 >= 2 返回与正则表达式匹配 ^(((-*)[1-9]+)([0]{"+ n + "})+)+((-*)[1-9] +)$(根据具体情况,可能是 true 或 false)。

The regex matches any quantity of numbers (negative included) separated by n zeros between them.

<小时/>

实现:

此实现从您的问题中获取输入(您可以进一步测试它),并在之前的伪算法评估后返回 true 或 false。我还打印当前字符串(来自步骤 2)以供引用。

主程序:

import java.util.Arrays;
import java.util.regex.Pattern;

public class Nzero
{
    public static void main ( String [ ] args )
    {

        int [ ] arr1 = { 0 , 0 , 0 , 2 , 0 , 2 , 0 , 2 , 0 , 0 };
        int [ ] arr2 = { 12 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 8 };
        int [ ] arr3 = { 0 , 0 , 0 , 0 , 5 , 0 , 0 , 4 , 0 , 0 , 6 };
        int [ ] arr4 = { 0 , 0 , 0 , 0 , 5 , 0 , 0 , 4 , 0 , 0 , 0 , 6 };
        int [ ] arr5 = { 0 , 0 , 0 , 0 , 5 , 0 , 4 , 0 , 0 , 6 };
        int [ ] arr6 = { 0 , 0 , 0 , 0 };
        int [ ] arr7 = { 0 , 0 , 1 , 0 , 0 };

        System.out.println ( isNzeroPack ( arr1 , 1 ) ); // true
        System.out.println ( isNzeroPack ( arr2 , 7 ) ); // true
        System.out.println ( isNzeroPack ( arr3 , 2 ) ); // true
        System.out.println ( isNzeroPack ( arr4 , 2 ) ); // false
        System.out.println ( isNzeroPack ( arr5 , 2 ) ); // false
        System.out.println ( isNzeroPack ( arr6 , 3 ) ); // false
        System.out.println ( isNzeroPack ( arr7 , 2 ) ); // false

    }

    private static boolean isNzeroPack ( int [ ] arr , int n )
    {

        String numbers = Arrays.toString ( arr ).replaceAll ( "\\[|\\]|,|\\s" , "" );
        numbers = numbers.replaceAll ( "[0]+$" , "" );
        numbers = numbers.replaceFirst ( "^0+(?!$)" , "" );
        //informational print
        System.out.println ( numbers );

        Pattern pattern = Pattern.compile ( "^(((-*)[1-9]+)([0]{" + n + "})+)+((-*)[1-9]+)$" );
        return numbers.length ( ) < 2 ? false : pattern.matcher ( numbers ).find ( );

    }

}

输出:

20202
true
120000000-8
true
5004006
true
50040006
false
504006
false

false
1
false

注意:输出中有一个空行(这是预期的)。

希望对你有帮助:)

关于java - n 零填充数组是一个 如果其数组参数是 n 零填充,则该函数返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41111977/

相关文章:

arrays - 在 PostgreSQL 中将位串转换为数组

java - 入门教程(错误)

java - 异常后未发出 Spring 集成消息

java - 抓取我们的网站以检查 Javascript 错误

javascript - 如何将 'attach' ASP.NET 字节数组转换为表单上的 'file' 类型输入字段?

二维数组上的缓存未命中

php - 使用数组值更新 MySQL 数据库

arrays - 3d 数组 R 中的 n 个前邻居列表

java - Huxley : java. util.NoSuchElementException:找不到行

java - 在本地主机错误启动 tomcat v9.0 服务器