有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从3个框中找出一个重复的数字

我有3个盒子,每个盒子里有10张编号的纸(1-10),但所有3个盒子里都有一个相同的数字,例如:盒子1有数字4,盒子2有数字4,盒子3也有数字4。如何以高效/最快的方式在java中找到重复的数字


共 (2) 个答案

  1. # 1 楼答案

    阅读你的问题描述“每个盒子包含10张编号的纸(1-10),但所有3个盒子中都有一个相同的编号”我认为:

    • 每个盒子正好有十张纸
    • 每张纸上都有一个从1到10的数字
    • 这三个框中只有一个数字
    • (因此,其他数字可能会出现多次)

    就像这里,数字“8”是所有三个框中唯一出现的一个

        int[] a = new int[] {  3,  2,  7,  5,  8,  2, 10,  6,  9,  7,  3 };
        int[] b = new int[] {  1,  4,  8,  7,  5,  1,  3,  2,  2,  4,  1 };
        int[] c = new int[] {  8,  4,  1,  6, 10,  9,  6,  4,  9,  6,  4 };
    

    这是你的问题吗

    然后您写道:“如何以高效/最快的方式在java中找到重复的数字?”

    现在你希望效率/速度如何?你说的是O(n)高效(即使盒子没有分类),比如这里(稍微有些模糊,让你有点困惑):

        int s = 0;
        int t = 0;
        int u = 0;
        for (int i = 0; i < 10; i++) {
            s |= 1 << a[i];
            t |= 1 << b[i];
            u |= 1 << c[i];
        }
        System.out.println( Integer.numberOfTrailingZeros( s & t & u ) );
    

    ;)

    不知怎的,我不确定你的老师会认为你想出了那个答案:)

  2. # 2 楼答案

    这里有一个简单的算法来解决这个问题。这并不是最快/最有效的,但因为你连最简单的逻辑都在挣扎,所以这个应该是有教育意义的。它在这里以伪代码呈现,并附有注释:

    Boolean boxHasNumber(Box b, Number x) // does Box b have Number x?
      FOR EVERY Number n IN Box b
         IF n = x RETURN True
      // otherwise x is not in box
      RETURN False
    
    Number sameNumber(Box b1, b2, b3) // which number appears in all 3 boxes?
      FOR EVERY Number x FROM 1 TO 10
         IF boxHasNumber(b1, x) AND
            boxHasNumber(b2, x) AND
            boxHasNumber(b3, x)
                 RETURN x
      // otherwise, no number appears in all 3 boxes
      ERROR
    

    请注意所谓的辅助函数的用法。基本上,查找一个数字是否在一个盒子中的逻辑被封装在它自己的完整、可重用、可测试的函数中。这使得整体逻辑更具可读性