如何消除打印行中的重复项

34gzjxbg  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(351)

在过去的5个小时里,我一直在努力解决这个问题,我已经筋疲力尽了。。
我需要建立一个方法,该方法需要一个数字数组,并确定哪个正确的数字在thr数组中显示的次数最少。例如,如果数组为[134126341245667],则显示的数字为7。。我希望我足够清楚:(
无论如何,这就是代码。我设法找到了显示数字的部分,但它将显示循环运行的次数。
请帮忙

public static boolean QuestionD(int[] arr)
    {
        int counter = 0;
        int printNum = 0;
        String[] arr2 = new String[arr.length];
        int[] arr3 = new int[arr.length];
        for (int i = 0; i < arr.length; i++)
            if (arr[i] < 0)
                return false;//if the numbers are negative return false;
        for (int j = 0; j < arr.length; j++)
        {
            printNum = arr[j] % 10;// get the right digit of the number
            {
                for (int i = 0; i < arr.length; i++)
                    if (arr[i] % 10 == printNum)// if the right digit of the first index matches the other index then counter ++;
                        counter++;// to count how many times the right digit is shown
                arr2[j] = printNum + "" + counter;// to make the number as a string and will be 2 digits , the first digit from the left
                //will be the digit that appears on the right , and the second digit will be the times that the digit appeared
                arr3[j] = Integer.parseInt(arr2[j]);//make it back to an int
                counter = 0;// setting counter back to zero to check the other numbers
            }
        }

        for (int i = 0; i < arr.length; i++)
        {
            for (int j = i + 1; j < arr.length; j++)
                if (arr3[i] % 10 < arr3[j] % 10)
                    System.out.print((arr3[i] / 10 % 10) + " ");// here i take the digits that were shown the less but will duplicates 
            //as many times as the for loop runs for.

        }

        return true;
    }
nbnkbykc

nbnkbykc1#

如果您对使用map来存储频率而不是数组感兴趣(在这种情况下,您不需要处理零频率的数字)。您可能会发现此解决方案很有帮助。这里我只是填充频率图,然后得到最小值的条目:

private static int getLeastFrequentDigit(int[] array) {
    Map<Integer, Integer> digitFrequencyMap = new HashMap<>();

    for (int j : array) {
        int key = j % 10;
        digitFrequencyMap.merge(key, 1, Integer::sum);
    }

    Map.Entry<Integer, Integer> minEntry = digitFrequencyMap.entrySet().stream()
            .min(Comparator.comparingInt(Map.Entry::getValue))
            .orElse(null);
    return minEntry != null ? minEntry.getKey() : -1;
}
lh80um4z

lh80um4z2#

嗯,我认为你的解决方案可以简单得多。
如果我理解正确,您希望:
对于每个数字,提取最右边的数字;
记录每个数字的频率;
显示出现次数最少的一个。
下面是你如何做到这一点的。由于选项的数量非常少(只有10个数字),您可以简单地创建一个大小为10的数组,以跟踪每个数字的所有出现次数1。

// First, we'll define an integer array with size 10 with indexes from 0 to
// 9. We can use the indexes to store the frequencies of each of the digits
// from 0 to 9.
int[] frequencies = new int[10];

// Then we collect the frequencies of all numbers. We walk over each element
// of the array
for (int number : numbers) {
    // We use the remainder operator to get the rightmost digit. This
    // guarantees that the result of the operation never exceeds 9.
    int digit = number % 10;

    // We increment the counter for that specific integer
    frequencies[digit]++;
}

// Now we have the frequencies of all digits. Now all we have to do is walk
// over our collected frequencies, and check which one has the lowest
// frequency.

// We initialize the digit and its frequency with -1, which means in our case
// that we have not yet recorded a least frequency.
int leastQuantity = -1;
int leastNumber = -1;

// Now we must check all digits
for (int i = 0; i < 10; i++) {
    // A composite if statement, doing some magic. How it works, see below.
    if (frequencies[i] > 0 && (frequencies[i] < leastQuantity || leastNumber == -1)) {
        leastQuantity = frequencies[i];
        leastNumber = i;
    }
}

System.out.println("The rightmost digit " + leastNumber + " occurs " + leastQuantity + " times");
// Or if you want to list all numbers with the least frequency:
for (int i = 0; i < frequencies.length; i++) {
    if (frequencies[i] == leastQuantity) {
        System.out.println(leastNumber);
    }
}

那个 if 声明: frequencies[i] > 0 -频率必须大于0。如果数字的频率为0,则它根本不会出现,也就是说,它从来不是数组中任何数字的最右边数字。所以我们必须只计算大于0的频率。
以下任一项必须为真: leastNumber == -1 -这意味着我们还没有记录频率,所以如果频率大于0,我们必须记录它。 frequencies[i] < leastQuantity -如果当前频率低于上次记录的频率,则更新数字及其频率。
这里有一些假设: numbers 不是 null . 你可能想写信 Objects.requireNonNull(numbers) 作为方法体的第一条语句,为了快速失败。 numbers.length > 0 . 你可能想写信

if (numbers.length == 0) {
    throw new IllegalArgumentException("Given array has no elements");
}

里面没有一个数字 numbers 答案是否定的。如果其中任何一个数字为,则代码尝试以负数组索引写入,从而导致错误 ArrayIndexOutOfBoundsException 被扔掉。我们可以允许负数,但我们必须确保 digit 是绝对的:

int digit = Math.abs(number % 10);

1可能有一些数字永远不会作为最右边的数字出现,留下未使用的数组位置。在您的特定示例中,这将是除4和7之外的所有数字。对于较小的值,例如10,这是完全正确的。但是,如果要提取最右边的四个数字并计算频率,那么最终将得到一个非常大的数组,可能有许多未使用的位置。在这种情况下,您最好使用( Hash ) Map 将某个数字Map到其频率。使用这种Map,它将不再包含未使用的值,而是只包含频率大于0的数字。有关示例,请参阅rohan kumar的答案。

相关问题