为了账号安全,请及时绑定邮箱和手机立即绑定

判断一个整数内有没有相同的数字。

/ 猿问

判断一个整数内有没有相同的数字。

deemos 2018-05-02 11:08:55

如果我给出一个整数,是用一个算法来判断这个整数内有没有相同的数字。
就好比说
123456789是没有相同数字的整数。
123444489是有相同数字的整数。

虽然有了一种思路,但是相当的麻烦,希望求一个算法,有想法的可以来讨论一下~

查看完整描述

8 回答

?
yanrun

还有一种思路就是把数字分解,然后把每个数字都放入Set中,因为Set中是不会存在相同的元素的,所以比较Set的大小和字符串的大小就可以知道有没有重复数字了,相同则没有,Set的长度小于字符串长度则存在相同数字

    public static void main( String[] args ) {        
        Integer num = 1234444890;		
        Integer remain = 0;		
        Integer count = 0;		
        java.util.Set<Integer> set = new java.util.HashSet<>();		
        while(num > 0) {			
            remain = num % 10;			
            set.add(remain);			
            num /= 10;			
            count++;		
        }
        boolean hasRepeatNum = set.size() != count;        
        System.out.println("有没有重复数字=" + hasRepeatNum);    
    }


查看完整回答
4 反对 回复 2018-05-02
  • 猎豹012
    猎豹012
    这个算法不错
  • 我吃西瓜很快
    我吃西瓜很快
    基本的思路对了。 1、set可以替换为bool数组,毕竟数字一共只有10个。 2、不需要计数,而是一旦检测到有重复接着就可以返回是否有重复数字的结果了。
  • deemos
    deemos
    同意,谢大佬指点~
已采纳
?
我吃西瓜很快

效率最高的思路不难,就是怎么不转换成字符串来获得每个位的数字,

用进制转换的算法就能获得

while(n>0){
  c=n%进制; //c是该位上的数字,个位/十位/百位……
  n=n/进制;
}

这里是10进制,就换成10就好。

JS写法:

function test(n){
  var num=[];
  while(n>0){
    var c=n%10;
    if(num[c]) return true;
    num[c]=true;
    n=Math.floor(n/10);
 }
 return false;
}

C写法:

bool test(int n) {
  bool[] num = new bool[10];
  while (n > 0) {
    int c = n % 10;
    if (num[c]) return true;
    num[c] = true;
    n = n / 10;
  }
  return false;
}

 

查看完整回答
反对 回复 2018-05-02
?
qq_承诺_2

利用数组。先将数字转换字符串,在将字符串转换字符数组。

public static void main(String[] args) {
    Integer numbers = 123456678;
    char[] numberChars = numbers.toString().toCharArray();
    for(int i = 0; i < numberChars.length-1; i++){
        if(numberChars[i] == numberChars[i+1]){
            System.out.println("存在重复数字为:"+numberChars[i]);
        }
    }
}


查看完整回答
反对 回复 2019-09-17
?
Java从入门到绝望

我的想法是把整数按位转换成数组,再用双层循环去对比。我也是菜鸟不知道好不好,哈哈。

import java.util.*;


public class cool {

     public static void main(String[] args) {

    System.out.print("请输入数字:");  

Scanner input= new Scanner(System.in);

    Integer num=input.nextInt();

    int count=0;

    String stri=null;

    String str = num.toString();// 转化为字符串

    int[] intArray = new int[str.length()];// 新建一个数组用来保存num每一位的数字

    for (int i = 0; i < str.length(); i++) {

    // 遍历str将每一位数字添加如intArray

    Character ch = str.charAt(i);

    intArray[i] = Integer.parseInt(ch.toString());

    }

    Arrays.toString(intArray);

    System.out.println("转换为数组后为"+Arrays.toString(intArray));

    int j,i;

    for( i=0;i<intArray.length;i++){

    for(j=0;j<intArray.length && j!=i;j++){

    stri=(intArray[i]==intArray[j])? "ture":"false";

    if(stri=="ture"){

     count++;

    }

   }  

}  

    System.out.println("有"+count+"个相同数字");

    }

}


查看完整回答
反对 回复 2018-05-03
?
前端小蜘蛛
let repetitionNum = function (num = 0) {
    let toArr = num.toString().split('')
    let J_Set = new Set(toArr)
    if (toArr.length != J_Set.size) {
        return true
    } else {
        return false
    }
}

思路:将整数转化为Set数据结构(J_Set)和数据(toArr),由于Set可以去重,所以Set的长度和toArr长度比较就可以知道结果。

查看完整回答
反对 回复 2018-05-02
?
qq_杀意隆_0
private static void mumbersChecks(long num) {
	String numString = new Long(num).toString();
	String[] nums = numString.split("");
    boolean isSame = false;
	for (int i = 0; i < nums.length - 1; i++) {
	    for (int j = i + 1; j < nums.length; j++)
	        if (nums[i].equals(nums[j])) {	
		        isSame = true;	
        	    break;		
	        }		
	    if (isSame)	
		    break;		
    }		
    System.out.println((isSame ? "" : "没") + "有相同的数字");
}


查看完整回答
反对 回复 2018-05-02
?
Keyro

var num = 1234567892;

//返回false表示有相同数字,true表示没有

function isUniqNumber(num){

    var arr = num+''.split('');

    for(var i=0,len=arr.length;i<len;i++){

        for(var j=0,len=arr.length;j<len;j++){

            if(arr[j]===arr[i] && i!==j){

                return false

            }

        }

    }

    return true;

}


isUniqNumber(num)


查看完整回答
反对 回复 2018-05-02
?
林逸舟丶

不知道Java有没有把数字直接转字符串的方法

或者通过前缀显示强制转换:str=(string)123456达成目的

然后对字符串进行双重循环进行查找


var flag=false

for(i=0;i<str.length;i++)

    var current=str[i]

    for(j=0;j<str.length;j++)

        if(current==str[j])

            flag=true


if(flag)

    echo '存在相同字符串'


当然 这种方法不是最优性能 但也算比较直观的思路 应该还有更有方案

查看完整回答
反对 回复 2018-05-02
  • deemos
    deemos
    嗯,咱俩的思路是差不多的,我比你麻烦的地方在于我是使用循环求余存入数组,再进行双循环遍历数组。在实际使用的时候相当麻烦,不仅要去除使用跳出结束循环,还要写入另一个选择剔除由于遍历到数组的同一个数据而删除的数据。也就是在双循环里还要嵌套至少3个选择跳出。
  • deemos
    deemos
    就好比说当i j都是1的时候,并不是数里有重复数字,而是取到了数组的相同位置。

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信