如何检查一个数字是否以任何顺序包含它自己?

问题描述:

我试图做一些事情,我有两个数字(比如说123和321)。我想检查第一个数字是否与第二个数字相同。我知道如果我单独检查1,2和3,该怎么做,但我想检查整个整数。换句话说,我需要一个代码,上面写着“如果x(以任意顺序)具有相同的数字,那么......” 任何帮助都非常感谢!如何检查一个数字是否以任何顺序包含它自己?

+5

将两个字符串拆分为整数列表,对列表进行排序然后进行比较。 –

+0

如果其中任何一个数字都是负数,您希望发生什么? – sprinter

+0

@sprinter我其实并没有想过这件事。因为我试图做一个小型的博彩游戏,所以这些数字不会是负面的。所以它会说:“如果你投注数字123,赢的数字是123,你赢600美元(作为一个例子)。如果你投注123,赢的数字是231,你赢了200美元(因为你有相同的数字,但是按照错误的顺序),如果你投注了123并且数字是586,那么你输了。“如果数字是负数,我可能会说“这不是一个有效的投注或中奖号码”。 – Andre

不确定Java语法,但将每个数字转换为数组。按升序排列数组。转换回数字并进行比较。

如果您不想完全匹配(即112233和123都共享相同的数字),然后遍历1数组,并查看每个数字是否包含在另一个数字中。

此代码会将这两个整数转换为字符串,然后检查字符串是否长度相同,第二个字符串是否包含第一个字符的所有字符。

public class Sandbox { //opens class 

    public static void main(String[] args) { 
     int x = 125; 
     int y = 321; 
     boolean hasNumbers = true; 
     String a = Integer.toString(x); 
     String b = Integer.toString(y); 

     if(a.length() == b.length()) { 
      for(int i = 0; i < a.length(); i++) { 

       if(!b.contains(String.valueOf(a.charAt(i)))) { 
        hasNumbers = false; 
       } 
      } 
      if(hasNumbers) { 
       System.out.println(x + " contains the digits of " + y); 
      } 
      else { 
       System.out.println(x + " does not contain the digits of " + y); 
      } 
     } 
     else { 
      System.out.println("The length of " + x + " and " + y + " are different"); 
     } 
    } 
} 

你绝对可以整理它,但我相信它解决了你陈述的问题。

+0

该算法的复杂性是O(n2),因为b.contains是一个O(n)操作。我认为可以在O(n)中完成。 – Simon

+0

OP究竟在哪里说算法需要O(n)? –

+0

我不是说OP要求O(n)算法,但越快越好,不是吗? :P – Simon

编辑:基本思想:该算法只是将出现在“a”中的所有数字存储在一个集合中,并检查是否存在“b”中不存在的任何数字。

这里是一些实现这个逻辑的代码。它基本上利用了这个事实,即Set不包含重复的元素。 HashSet可以执行add,包含在一个常量时间内,加上最大的数字大小设置为10,该函数可以在O(n)中执行。

public boolean checkSameDigits(int x, int y){ 
    String a = Integer.toString(x); 
    String b = Integer.toString(y); 

    Set digits = new HashSet(); 
    for(int i = 0; i < a.length(); i++) { 
     digits.add(a.charAt(i)); 
    } 

    for(int i = 0; i < b.length(); i++) { 
     if(!digits.contains(b.charAt(i))) 
      return false; 
    } 
    return true; 
} 

如果转换每个数字到数字的排序列表,那么你可以只比较这两个名单:

private List<Integer> sortedDigits(int number, int base) { 
    assert number >= 0 && base > 0; 
    List<Integer> digits = new ArrayList<>(); 
    for (int n = number; n > 0; n /= base) 
     digits.add(n % base); 
    digits.sort(); 
    return digits; 
} 

那么接下来sortedDigits(number1, 10).equals(sortedDigits(number2, 10))将检查数字是10为基数

相同

相当短的实施是为了得到每一个char[],排序,并检查它们是相同的:

import java.util.Arrays; 

public class Whatever { 
    public static final boolean sameDigits(final int m, final int n) { 
     final char[] m2 = ("" + m).toCharArray(); 
     final char[] n2 = ("" + n).toCharArray(); 
     Arrays.sort(m2); 
     Arrays.sort(n2); 
     return Arrays.equals(m2, n2); 
    } 
}