繁体   English   中英

一种计算数字频率的方法

[英]A method for calculating the frequency of digits

我编写了一个类,通过将两位数相加来求出整数的总和。 例如0, 5, 12, 213, 999 and 1111的数字总和分别是` 0, 5, 12, 213, 999 and 1111和 4。 我需要写一个方法:

public static double digitTotalFrequency(int max, int digitTotal)

此方法应return具有给定digitTotal的所有数字在 0, 1...max 范围内的数字的比例。 例如, digitTotalFrequency(9, 3)0.1因为前 10 个数字中只有一个数字的总位数为 3。此外, digitTotalFrequency(99,3)0.04 (因为在前 100 个数字中只有数字 3, 12、21 和 30 的 digitTotal 为 30)。 我正在努力做到这一点,请帮助,谢谢。

public static double digitTotalFrequency(int max, int digitTotal){ 
    int number = max; 
     while (number>0) { 
       digitTotal = digitTotal + (number%10); 
       number = number/10; 
     } 
  return digitTotal/max; 
} 

你需要把你的任务分成两部分

  1. 保持对 0 到最大范围内所有数字的总位数的运行计数。
  2. 将每个数字的总位数保持在 0 到最大范围内。

例如,12 和 21 的数字总和将是相同的。 因此您需要将此信息存储在某处以便再次使用它。 这将减少您所做的工作量。

这被称为动态规划或记忆化。

试着稍微考虑一下。 如果你挣扎,我可以让你开始一些代码

编辑:程序代码

试着通读这篇文章,看看到底发生了什么

public class Jnk {

    public static void main(String[] args) {

        System.out.println(digitTotalFrequency(99,3));
    }

    public static double digitTotalFrequency(int max, int digitTotal){ 

        HashMap<String,Integer> counts = new HashMap<String,Integer>();

        counts.put("0", 0);
        counts.put("1", 1);
        counts.put("2", 2);
        counts.put("3", 3);
        counts.put("4", 4);
        counts.put("5", 5);
        counts.put("6", 6);
        counts.put("7", 7);
        counts.put("8", 8);
        counts.put("9", 9);

        int [] runs = new int[1];

        if(max<=10)
            return (double)digitTotal/max;

        else
            getTotal(0,max,counts,runs,digitTotal);

        return (double)runs[0]/max; 
    }

    private static void getTotal(int currentNumber, int max, HashMap<String, Integer> counts,int [] runs, int target) {


        if(currentNumber==max)
            return;

        String key = getKey(currentNumber);

        if(counts.containsKey(key))
        {
            int total = counts.get(key);

            if (total==target)
            {
                System.out.println("Found "+currentNumber);
                runs[0] += 1;
            }
            getTotal(currentNumber+1,max,counts,runs,target);
        }
        else
        {   
            int total = getDigitCount(currentNumber);

            counts.put(key, total);

            if (total==target)
            {
                System.out.println("Found "+currentNumber);
                runs[0] += 1;
            }
            getTotal(currentNumber+1,max,counts,runs,target);
        }
    }

    private static Integer getDigitCount(int currentNumber) {

        int digitTotal = 0;
        while (currentNumber>0) { 
               digitTotal = digitTotal + (currentNumber%10); 
               currentNumber = currentNumber/10; 
             } 

        return digitTotal;
    }

    private static String getKey(int min) {

        String number = String.valueOf(min);

        char[] numberArray = number.toCharArray();
        Arrays.sort(numberArray);
        String key = String.valueOf(numberArray);

        return key;
    } 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM