首页 > 其他分享 >【230429-4】求所有仅由1,2,3,4,5组成的没有重复数字的四位数的和

【230429-4】求所有仅由1,2,3,4,5组成的没有重复数字的四位数的和

时间:2023-04-29 21:33:14浏览次数:53  
标签:24 arr 230429 四位数 重复 List re int new

【数学解法】

由1,2,3,4,5组成的没有重复数字的四位数有A54=120个

以千位为例,在此出现的1,2,3,4,5的几率是均等的,即每个数都出现了120/5=24次。

也就是说,120个数的千位加起来是(1*24+2*24+3*24+4*24+5*24)*1000=15*24*1000

同样的道理,120个数的百位加起来是(1*24+2*24+3*24+4*24+5*24)*100=15*24*100

120个数的十位加起来是(1*24+2*24+3*24+4*24+5*24)*10=15*24*10

120个数的个位加起来是(1*24+2*24+3*24+4*24+5*24)*1=15*24*1

其总和=15*24*1111=399960

【代码解法】

做一个A54的排列,把每个数累计即可。

主类Summary:

package test230429;

import java.util.List;

/**
 * 求所有仅由1,2,3,4,5组成的没有重复数字的四位数的和
 */
public class Summary {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4,5};
        Arranger arranger2 = new Arranger(numbers, 4);

        int sum=0;
        for (List<Integer> re : arranger2.getResults()) {
            sum+=1000*re.get(0)+100*re.get(1)+10*re.get(2)+1*re.get(3);
        }

        System.out.println("Sum="+sum);
    }
}

 

辅助类Arranger:

package test230429;

import java.util.ArrayList;
import java.util.List;

/**
 * 用于产生排列结果的工具类
 * 从n个元素中取出m个元素,按照一定的顺序排成一列。得到所有排列的方案
 */
public class Arranger {
    // 保存在内部的对原始元素数组的引用
    private int[] arr;

    // 总计多少元素,此即数组长度
    private final int n;

    // 选多少个
    private final int m;

    // 返回结果
    private List<List<Integer>> results;

    /**
     * 构造函数一
     * 这个构造函数是用于全排列的(n=m=数组长度)
     *
     * @arr 原始元素数组
     */
    public Arranger(int[] arr) {
        this.arr = arr;
        this.n = arr.length;
        this.m = arr.length;

        this.results = new ArrayList<>();
        doArrange(new ArrayList<>());
    }

    /**
     * 构造函数二
     * 这个构造函数是用于部分排列的(m<n=数组长度)
     *
     * @param arr    原始元素数组
     * @param selCnt 选多少个
     */
    public Arranger(int[] arr, int selCnt) {
        this.arr = arr;
        this.n = arr.length;
        this.m = selCnt;
        if (m > n) {
            throw new ArrayIndexOutOfBoundsException("m:" + m + " >n:" + n);
        }

        this.results = new ArrayList<>();
        doArrange(new ArrayList<>());
    }

    /**
     * 使用递归进行全排列,结果放在results中
     *
     * @param initialList 初始链表
     */
    private void doArrange(List<Integer> initialList) {
        List<Integer> innerList = new ArrayList<>(initialList);

        if (m == initialList.size()) {
            results.add(innerList);
        }

        for (int i = 0; i < arr.length; i++) {
            if (innerList.contains(arr[i])) {
                continue;
            }

            innerList.add(arr[i]);
            doArrange(innerList);
            innerList.remove(innerList.size() - 1);
        }
    }

    /**
     * 获得结果链表的引用
     *
     * @return
     */
    public List<List<Integer>> getResults() {
        return results;
    }

    // 测试
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4};
        Arranger arranger = new Arranger(numbers);

        System.out.println("四元素全排列示例:");
        int idx = 0;
        for (List<Integer> re : arranger.getResults()) {
            System.out.println(String.format("%02d", ++idx) + "." + re);
        }

        Arranger arranger2 = new Arranger(numbers, 2);
        System.out.println("\n四选二排列示例:");
        idx = 0;
        for (List<Integer> re : arranger2.getResults()) {
            System.out.println(String.format("%02d", ++idx) + "." + re);
        }
    }
}

【程序输出】

Sum=399960

两种分析能相互印证。

END

标签:24,arr,230429,四位数,重复,List,re,int,new
From: https://blog.51cto.com/u_7726611/6236899

相关文章

  • 【230429-3】证明:任意给出九个空间格点,其至少有一对格点的奇偶性相同,且其中点坐标亦为
    【名词解释:格点】格点即三坐标都为整数的空间点,因其位置在虚拟的网格上故称格点。【格点奇偶性的八种情况】代码证明:packagetest230429;/***按奇偶性确定空间中格点的种类*格点,即xyz三坐标皆为整数的空间点*xyz为奇偶各有两种可能性,整体便有2^3=8种*8种意味着:一旦点......
  • 【230429-2】用三重循环输出立方体的八个顶点坐标
    【代码】packagetest230429;/***输出立方体的八个顶点坐标*边长为a的立方体一角在(0,0,0),其对角在(a,a,a),求所有顶点的坐标*这是一个可重排列问题,在2阶集合{"0","a"}中进行3次选取。*使用三重循环即可解决此问题。*/publicclassCubeTops{publicstaticvoid......
  • 剑指 Offer II 083. 没有重复元素集合的全排列
     分析:今天看的明日一练,这道题有点忘了怎么做了先偷个懒,用了个全排列函数,后面再研究代码:1classSolution(object):2defpermute(self,nums):3"""4:typenums:List[int]5:rtype:List[List[int]]6"""7returnlis......
  • 接口重复调用限制过滤器
    注解类importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***重复请求过滤器*/@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD......
  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子
    最长递增子序列力扣题目链接(opensnewwindow)给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7......
  • distinct,sql语句去掉重复值,去掉重复值
    感谢老紫竹群中joejoe1991帮助selectdistinctdwfromkk.kkyh这条语句查出来的dw是没有重复值的 黑色头发 http://heisetoufa.iteye.com如果发现本文有误,欢迎批评指正......
  • 最长不含重复字符的子字符串
    classSolution{public:intlongestSubstringWithoutDuplication(strings){intlen=0,n=s.size(),cnt[30];memset(cnt,0,sizeofcnt);for(inti=0,j=0;j<n;j++){cnt[s[j]-'a']++;......
  • navicat删除表中重复数据的sql语句
    DELETEFROM`hao123`WHEREir_urlIN(SELECTir_urlFROM(SELECTir_urlFROM`hao123`GROUPBYir_urlhavingcount(ir_url)>1)a)ANDir_idNOTIN(SELECT*FROM(SELECTmin(ir_id)FROM`hao123`GROUPBYir_urlHAVINGcount(ir_url)>1)b);hao123:表名。ir_......
  • struts1 重复提交
    Struts的Token机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中......
  • 466. 统计重复个数
    统计重复个数定义str=[s,n]表示str由n个字符串s连接构成。例如,str==["abc",3]=="abcabcabc"。如果可以从s2中删除某些字符使其变为s1,则称字符串s1可以从字符串s2获得。例如,根据定义,s1="abc"可以从s2="abdbec"获得,仅需要删除加粗且用斜体标识的字符......