删除3s的输出未按预期进行

时间:2015-12-05 11:34:51

标签: java arrays

  

给定数字作为输入的数组,从数组中删除所有元素,它们是3的倍数或者其中包含数字3。对于例如如果它们存在,则将从阵列中移除13和15。

MyApproach

要删除3,我已经使函数removeMultiple首先删除了3的倍数(如果存在的话)。然后我还创建了函数removeDigit如果数字不是3的倍数,则删除数字3。 但我没有得到预期的产出。

  

MyQuestion:我在我的代码中做错了什么。任何人都可以指导我吗?

@Edit:

boolean containsDigit3(int[] arr,int index)
{

  boolean b1=false;
  while(arr[index]>0)
  {
        int p=arr[index]%10;
         if(p==3)
         {

            b1=true;

         }
         arr[index]=arr[index]/10;  
  }

     if(b1==true)
     return true;
     else
     return false;
 }

boolean isMultipleOf3(int[] arr,int index)
{
  boolean b1=false;

        int p=arr[index]%3;
         if(p==0)
         {

            b1=true;

         }



     if(b1==true)
     return true;
     else 
     return false;



}

 public int[] remove(int[] arr) 

 {
    // Array of max length
    int p[] = new int[arr.length];
    int count = 0;
  for (int i = 0; i < arr.length; i++) 
  {
    if (!isMultipleOf3(arr,i) && !containsDigit3(arr,i))
    {
        p[i] = arr[i];
        ++count;
    }
  }
    // Array of right length - System.arraycopy not allowed?!
   int[] q = new int[count];
   for (int i = 0; i < q.length; ++i) 
   {
     q[i] = p[i];
   }
  return q;
}

Parameters                   Actual Output       Expected Output

'{24,27,30,31,34,37,40,42}' {0}                  {40}

2 个答案:

答案 0 :(得分:1)

我会像这样写

`for i in list1:
    if i not in dict1.keys():
        dict1[0] = list1[0]
        dict1[1] = list1[1]
        dict1[2] = list1[2] 
        print(dict1)`
  

我必须对其进行硬编码。不允许使用内置函数。

在这种情况下,我会做类似上面的事情,除了&#34;硬编码&#34;

public int[] remove(int[] arr) {
    return IntStream.of(arr)
                    .filter(i -> i % 3 != 0)
                    .filter(i -> !(""+i).contains("3"))
                    .toArray();
}  

所以

public static int[] remove(int[] arr) {
    int[] ret = new int[arr.length];
    int count = 0;
    OUTER:
    for (int i : arr) {
        if (i % 3 == 0)
            continue;
        int j = i;
        while (j > 0) {
            if (j % 10 == 3)
                continue OUTER;
            j /= 10;
        }
        ret[count++] = i;
    }
    // do the same as Arrays.copyOf(ret, count)
    if (ret.length > count) {
        int[] ret2 = new int[count];
        for (int i = 0; i < count; i++)
            ret2[i] = ret[i];
        return ret2;
    }
    return ret;
}

打印

int[] arr = {24, 27, 30, 31, 34, 37, 40, 42};
int[] arr2 = remove(arr);
System.out.println(Arrays.toString(arr2));

答案 1 :(得分:1)

在完整阵列上操作可能比以前更困难。将代码分解为小而精确的部分,不要混淆迭代和使用check-for-3逻辑复制数组。

考虑使用此方法删除不需要的元素:

public int[] remove(int[] arr) {
    // Array of max length
    int p[] = new int[arr.length];
    int count = 0;
    for (int i = 0; i < arr.length; i++) {
        if (!isMultipleOf3(arr[i]) && !containsDigit3(arr[i])) {
            p[count] = arr[i];
            ++count;
        }
    }
    // Array of right length - System.arraycopy not allowed?!
    int[] q = new int[count];
    for (int i = 0; i < q.length; ++i) {
        q[i] = p[i];
    }
    return q;
}

现在,您可以专注于boolean isMultipleOf3(int i)boolean containsDigit3(int i)

的非常简单的方法

以下是一些非常基本的实现:

private boolean containsDigit3(int i) {
    //indexOf returns position of character '3' in String that
    //represents the number i. If '3' is not found it returns -1
    //so indexOf('3') >= 0 is another way of saying "contains digit 3"
    return Integer.toString(i).indexOf('3') >= 0;
}

private boolean isMultipleOf3(int i) {
    return i%3 == 0;
}