如果数组包含两个或多个非零元素,并且恰好有 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 作为函数的参数之一传递
示例
{0, 0, 0, 2, 0, 2, 0, 2, 0, 0} n=1 ans => 正确 || 1; 因为正好 1 个零分隔数组的所有非零元素
{12, 0, 0, 0, 0, 0, 0, 0, -8} n=7 答案=真|| 1 因为正好有 7 个零分隔数组的所有非零元素
{0, 0, 0, 0, 5, 0, 0, 4, 0, 0, 6} n=2 答案=真|| 1 因为正好有 2 个零分隔数组的所有非零元素
{0, 0, 0, 0, 5, 0, 0, 4, 0, 0, 0, 6} n=2 答案=假|| 0 因为4和6之间有3个0。
{0, 0, 0, 0, 5, 0, 4, 0, 0, 6} n=2 答案=假|| 0 因为5和4之间只有一个零。
{0, 0, 0, 0} n=3 答案=假0 因为数组必须至少有两个非零元素
{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;
}
最佳答案
我使用正则表达式研究了一些可能的解决方案:
获取数组的字符串表示形式:
来自:
{ 0 , 0 , 0 , 2 , 0 , 2 , 0 , 2 , 0 , 0 };
致:
0002020200
从字符串中删除前导零和尾随零。
所以,到目前为止我们得到的是:
20202
现在您必须选择:
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/