Google面试题:数字计数

xiaoxiao2021-02-28  57

题目

题目来源:Link

分析

代码

package com.graph; import java.util.*; public class Solution{ List<Integer> factorial = new ArrayList<Integer>(); public int solve(int n){ if (n==0) {//易遗漏 return 1; } if(n>10) n=11; n++;//转成实际位数 factorial.add(1); //n<=10 int[] nums = new int[n+1]; int t=1; int res=0; for(; t<n; t++){ if(t==1) {//易遗漏 nums[t] = 10; }else { //对于首位,为1~9种选择 //剩下t-1位,为9种选择 nums[t] = 9*(getFactorial(9)/getFactorial(9-(t-1)));//之前考虑遗漏被除数 } res = res+nums[t]; } System.out.println(res); return res; } int getFactorial(int fac){ int size = factorial.size(); if(fac<=size){ return factorial.get(fac-1); } for(int i=size+1; i<=fac; i++){ int topIndex = factorial.size()-1; int tmp = factorial.get(topIndex)*i; factorial.add(tmp); } return factorial.get(factorial.size()-1); } //优化方法,参考原始题目代码 //动态规划 public int solve_dp(int n) { //不能理解题给的公式 return 0; } //排列组合 public int solve_pe(int n) { if(n==0) return 1; if(n>10) n=10; int ans = 1; int mul = 9; for(int i=n-1; i>=0; i--) { if(i==0) { ans+=mul; }else { ans+=(n-i+1)*mul; } mul = mul*(10-n+i-1); } return ans; } public static void main(String[] args) { Solution s = new Solution(); s.solve(2); //s.solve(new int[] {1,2,4,8,7,9,6,3}); } }
转载请注明原文地址: https://www.6miu.com/read-80731.html

最新回复(0)