java n-zero-packed array is a如果数组参数为n-zero-packed,则函数返回true

6gpjuf90  于 2023-11-15  发布在  Java
关注(0)|答案(2)|浏览(100)

如果一个数组包含两个或多个非零元素,并且正好有n个零分隔所有相邻的非零元素(如果删除零),则该数组被定义为n-zero-packed。例如,数组{1,0,0,18,0,0,-8,0,0}是2-零 Package 的,因为1和18之间有两个零,18和-8之间有两个零,这说明了所有非零元素。数组{0,1,0,0,0,6,0,8,0,0,4}不是2-zero-packed,因为1和6之间有三个零,6和8之间只有一个零编写一个名为isNZeroPacked的函数,并使用以下签名boolean isNZeroPacked(int[] a,int n)如果函数的数组参数是n-zero-packed(注意,n作为函数的参数之一传递),则函数返回true
示例
1.{0,0,0,2,0,2,0,2,0,0} n= 1 ans => True|| 1;因为正好1个零分隔数组的所有非零元素
1.{12,0,0,0,0,0,0,-8} n=7 ans= true||因为正好有7个零分隔数组的所有非零元素
1.{0,0,0,0,5,0,0,4,0,0,6} n=2 ans = true||因为正好有2个零分隔数组的所有非零元素
1.{0,0,0,0,5,0,0,4,0,0,0,6} n=2 ans = false||因为4和6之间有三个零。
1.{0,0,0,0,5,0,4,0,0,6} n=2 ans= false||因为5和4之间只有一个0。
1.{0,0,0,0} n=3 ans= false 0,因为数组必须至少有两个非零元素
1.{0,0,1,0,0} n=2 ans= false|| 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;
    }

字符串

vuktfyat

vuktfyat1#

我使用正则表达式处理了一些可能的解决方案:
1.获取数组的String表示:
出发地:{ 0 , 0 , 0 , 2 , 0 , 2 , 0 , 2 , 0 , 0 };
至:0002020200
1.从字符串中删除前导零和尾随零。
所以,到目前为止,我们有:20202
1.现在你必须选择:
3.1.如果结果字符串长度< 2 return false。这符合两个非零元素的要求。
3.2.如果>= 2,则返回与regex ^(((-*)[1-9]+)([0]{" + n + "})+)+((-*)[1-9]+)$匹配的结果(根据具体情况,它可能为true或false)。
正则表达式匹配任何数量的数字(包括负数),它们之间由n个零分隔。

实现方式:

这个实现从你的问题中获取输入(你可以进一步测试它),并在前面的伪算法评估后返回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

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

希望对你有帮助:)

cl25kdpy

cl25kdpy2#

public int findDuplicate(int[] nums){

int nonZeroCount = 0;
    int zeroCount = 0;
    for(int i = 0; i < a.length; ++i) {
        
        boolean nZero = false;
        if(a[i] == 0)
            continue;
        else if(a[i] != 0 && i == a.length-1) {
            nonZeroCount++;
            break;
        }
            
        else if(a[i] != 0 && i != a.length-1) {
            
            nonZeroCount++;
            
            for(int j = i + 1; j <a.length; ++j) {
                if(a[j] != 0)
                    break;
                zeroCount++;
                if(a[a.length-1] == 0 )
                    zeroCount = n;
                
                if(zeroCount == n)
                    nZero = true;
            }
            
        }
        
        if(!nZero)
            return 0;
    }
    if(nonZeroCount < 2)
        return 0;
    return 1;
}

字符串

相关问题