编写查找int中最频繁数字的Java方法
在这个问题上我需要帮助: 编写一个方法mostFrequentDigit,返回数字中最常出现的数字值。示例:数字669260267包含:一个0、两个2、四个6、一个7和一个9。 mostFrequentDigit(669260267)返回6。 如果出现平局,返回数值较低的数字。 mostFrequentDigit(57135203)返回3 这是我现在拥有的代码,但它不起作用:编写查找int中最频繁数字的Java方法,java,arrays,Java,Arrays,在这个问题上我需要帮助: 编写一个方法mostFrequentDigit,返回数字中最常出现的数字值。示例:数字669260267包含:一个0、两个2、四个6、一个7和一个9。 mostFrequentDigit(669260267)返回6。 如果出现平局,返回数值较低的数字。 mostFrequentDigit(57135203)返回3 这是我现在拥有的代码,但它不起作用: public static int mostFrequentDigit(int num) { int largestCo
public static int mostFrequentDigit(int num)
{
int largestCount = 0;
int currentCount = 0;
String num0 = Integer.toString(num)
String mostFrequent = num0.substring(0,1);
for (int x = 0; x < num0.length(); x++)
{
if (num0.substring(x,x+1).equals(mostFrequent))
{
currentCount++;
}
if (currentCount > largestCount)
{
largestCount = currentCount;
mostFrequent = num0.substring(x,x+1);
}
}
return mostFrequent;
}
公共静态int-mostFrequentDigit(int-num)
{
int最大计数=0;
int currentCount=0;
字符串num0=Integer.toString(num)
字符串mostFrequent=num0.子字符串(0,1);
对于(int x=0;x最大计数)
{
最大计数=当前计数;
mostFrequent=num0.子串(x,x+1);
}
}
返回最频繁;
}
您必须跟踪所有数字的计数(例如,在数组中或映射中),并在对所有数字进行计数后获得结果
下面是一种使用数组的方法:
public class MyClass {
public static int mostFrequentDigit(int num) {
int n = Math.abs(num);
int digit = 0;
int max = 0;
int[] counts = new int[10];
while (n != 0) {
counts[n % 10]++;
n /= 10;
}
for (int i = 0; i < counts.length; i++) {
if (counts[i] > max) {
digit = i;
max = counts[i];
}
}
return digit;
}
public static void main(String args[]) {
System.out.println(mostFrequentDigit(57135203));
}
}
公共类MyClass{
公共静态int-mostFrequentDigit(int-num){
int n=Math.abs(num);
整数位数=0;
int max=0;
int[]计数=新的int[10];
而(n!=0){
计数[n%10]+;
n/=10;
}
for(int i=0;i最大值){
数字=i;
最大值=计数[i];
}
}
返回数字;
}
公共静态void main(字符串参数[]){
System.out.println(MOSTFrequentDigital(57135203));
}
}
此代码段使用模和整数除法操作的组合来获取单独的数字,并为每个数字增加数组中相应的计数器。计算完所有数据后,它将遍历数组以查找计数器最高的数字。代码中存在一些逻辑错误。
提供一个简单而简短的代码,如下所示
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
public static int mostFrequentDigit(int num) {
Map<String, Integer> map = new HashMap<String, Integer>();
for (int i = 0; i < 10; i++) {
String digit = String.valueOf(i);
map.put(digit, StringUtils.countMatches(String.valueOf(num), digit));
}
Comparator<Map.Entry<String, Integer>> byValue = Map.Entry.comparingByValue();
Map.Entry<String, Integer> maxEntry = Collections.max(map.entrySet(), byValue);
return Integer.parseInt(maxEntry.getKey());
}
import java.util.Collections;
导入java.util.Comparator;
导入java.util.HashMap;
导入java.util.Map;
导入org.apache.commons.lang3.StringUtils;
公共静态int-mostFrequentDigit(int-num){
Map Map=newhashmap();
对于(int i=0;i<10;i++){
字符串数字=字符串。值(i);
put(digit,StringUtils.countMatches(String.valueOf(num),digit));
}
Comparator byValue=Map.Entry.comparingByValue();
Map.Entry maxEntry=Collections.max(Map.entrySet(),byValue);
返回Integer.parseInt(maxEntry.getKey());
}
似乎是学校作业的问题。你的老师肯定希望你学习递归
因此,将数据收集到大小为10的数组中(如果您计算的是基数10,那么您可以对基数16执行相同的操作)
编写递归函数(根据需要调用自身的函数)
它取一个数的最后一位(十进制数为模10),并将该数的其余部分(除以10,但作为整数)传递给它自己的下一次调用(如果大于0)
递归终止后,您将得到一个带有数字计数的数组。
只需使用for循环处理它,然后找到具有最大值的索引,您可以通过java8方法执行以下操作:
public static int mostFrequentDigit(int num){
Map<String, Long> collect = Integer.toString(num).chars().mapToObj(c -> (char) c).map(String::valueOf)
.collect(groupingBy(Function.identity(), counting()));
long maxCount = collect.values().stream().reduce(Math::max).orElse(0L);
return collect.entrySet().stream().filter(a -> a.getValue() == maxCount)
.map(a -> Integer.parseInt(a.getKey())).reduce(Math::min).orElse(null);
}
公共静态int-mostFrequentDigit(int-num){
Map collect=Integer.toString(num).chars().mapToObj(c->(char)c).Map(String::valueOf)
.collect(groupby(Function.identity(),counting());
long maxCount=collect.values().stream().reduce(数学::max).orElse(0L);
return collect.entrySet().stream().filter(a->a.getValue()==maxCount)
.map(a->Integer.parseInt(a.getKey()).reduce(Math::min).orElse(null);
}
这是否满足“如果出现平局,返回数值较低的数字”条件?此外,如果使用外部库,最好指定从何处获取该库。当然,这满足“如果存在平局,则返回值较低的数字”条件。感谢提醒您指定可从何处获取该库。包java.util可以从中获得,它是java语言中常用的库。当然,这满足了“如果有平局,返回值较低的数字”的条件。我不知道怎么做。这张地图杂乱无章。您的maxEntry
将只包含上次遇到的具有最高值的条目。我不是说java.util
包。这是JDK的一部分。我说的是您正在使用的Apache Commons库。要更新org.Apache.Commons.lang3可以在这里找到感谢回复更新org.Apache.Commons.lang3可以在这里找到Collections.max将找到最频繁的数字和较低的值(不是最后遇到的)将对负数抛出异常。@Robby问题中没有负数,请仔细阅读问题。提供的两个示例中没有负数,但问题说明:“编写一个方法mostFrequentDigit,返回数字中最常出现的数字值。”它没有说正数。顺便说一句,如果可能有任何负值,你可以使用Integer.toString(Math.abs(num))
而不是Integer.toString(num)
。嗨!非常感谢你的帮助。你能为我澄清一下你在while循环中做了什么吗?目的是什么?你为什么要做n%10,为什么不只是n?谢谢<代码>n%10
将为您提供号码的最后一位数字。比方说,这个数字是3
。然后计数[n%10]++
转换为计数[3]++
,这意味着数组中第四个元素的值将递增。在while-loo的末尾