在过去的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;
}
2条答案
按热度按时间nbnkbykc1#
如果您对使用map来存储频率而不是数组感兴趣(在这种情况下,您不需要处理零频率的数字)。您可能会发现此解决方案很有帮助。这里我只是填充频率图,然后得到最小值的条目:
lh80um4z2#
嗯,我认为你的解决方案可以简单得多。
如果我理解正确,您希望:
对于每个数字,提取最右边的数字;
记录每个数字的频率;
显示出现次数最少的一个。
下面是你如何做到这一点的。由于选项的数量非常少(只有10个数字),您可以简单地创建一个大小为10的数组,以跟踪每个数字的所有出现次数1。
那个
if
声明:frequencies[i] > 0
-频率必须大于0。如果数字的频率为0,则它根本不会出现,也就是说,它从来不是数组中任何数字的最右边数字。所以我们必须只计算大于0的频率。以下任一项必须为真:
leastNumber == -1
-这意味着我们还没有记录频率,所以如果频率大于0,我们必须记录它。frequencies[i] < leastQuantity
-如果当前频率低于上次记录的频率,则更新数字及其频率。这里有一些假设:
numbers
不是null
. 你可能想写信Objects.requireNonNull(numbers)
作为方法体的第一条语句,为了快速失败。numbers.length > 0
. 你可能想写信里面没有一个数字
numbers
答案是否定的。如果其中任何一个数字为,则代码尝试以负数组索引写入,从而导致错误ArrayIndexOutOfBoundsException
被扔掉。我们可以允许负数,但我们必须确保digit
是绝对的:1可能有一些数字永远不会作为最右边的数字出现,留下未使用的数组位置。在您的特定示例中,这将是除4和7之外的所有数字。对于较小的值,例如10,这是完全正确的。但是,如果要提取最右边的四个数字并计算频率,那么最终将得到一个非常大的数组,可能有许多未使用的位置。在这种情况下,您最好使用(
Hash
)Map
将某个数字Map到其频率。使用这种Map,它将不再包含未使用的值,而是只包含频率大于0的数字。有关示例,请参阅rohan kumar的答案。