2014百度校招深圳站筆試題

題目描述:輸入任意正整數,比這個數大的最小不重複數(相鄰兩個數字不重複),例如1101是重複,1234不重複,1201不重複。
解題思路:先將number加1,然後判斷是否有數字重複,有重複繼續將number加1。
這是一種暴力的解法,如果輸入的數字爲111111111的話,那麼累計需要加上百萬次。

<span style="font-size:14px;">public class UnrepeatedValue {
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        solution(scanner.nextInt());
    }
    public static void solution(int number){
        String num=String.valueOf(number+1);
        if(num.length()==1){
            System.out.println(num);
        }else{
            boolean flag=true;
            while(flag){
                for(int i=0;i
                    if(num.charAt(i)==num.charAt(i+1)){
                        break;
                    }else{
                        if(i==num.length()-2){
                            System.out.println(num);
                            flag=false;
                        }
                    }
                }
                number++;
                num=String.valueOf(number);
            }
        }
    }
}</span>
上面對於這個問題採用暴力解法,顯然是不行的。這裏提供一個優化的版本,大體思路爲,從右往左判斷number+1。如果兩個數字重複,則直接將這兩個數取出來加1。然後將這個數後面的數置爲010101系列...
:這種解法也不是最優解。從右往左遍歷,當遍歷到高位了以後,低位的值還是重新置爲0101系列,那麼之前對低位的操作相當於是冗餘了。所以最優解應該是從左往右遍歷

從右往左遍歷

<span style="font-size:14px;">public class Unrepeated {
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        System.out.println(hasRepeated(s.nextLong()));
    }
    public static long hasRepeated(long number){
        String num=String.valueOf(number+1);
        long n;
        long result=0;
        while((n=merge(new StringBuilder(num)))!=0){
            num=String.valueOf(n);
            result=n;
        }
        if(result==0){       //判斷當number+1不需要merge的時候直接返回number+1。
            return number+1;
        }else{
            return result;
        }
    }
    public static long merge(StringBuilder s){
        for(int i=s.length()-1;i>0;i--){
            if(s.charAt(i)==s.charAt(i-1)){
                long l=Long.parseLong(String.valueOf(s.charAt(i-1)+String.valueOf(s.charAt(i))))+1;
                int m=s.length()-i-1;
                for(int j=0;j
                    l*=10;
                }
                s.setCharAt(i,'0');
                s.setCharAt(i-1,'0');
                long num=Long.parseLong(s.toString())+l;
                s=new StringBuilder(String.valueOf(num));
                //將後面的數置爲0101系列.
                for(int t=i+1;t
                    for(int j=0;j<2;j++){
                        if(s.charAt(t-1)!=(j+48)){
                            s.setCharAt(t, (char) (j+48)); //0的ASCII碼爲48
                            break;
                        }
                    }
                }
                return Long.parseLong(s.toString());
            }
        }
        return 0;
    }
}</span>
從左往右遍歷,其實寫法和上面差不多,但是這應該是最高效的吧
<span style="font-size:14px;">package org.whut.choumiaoer.interview;

import java.util.Scanner;

public class UnRepeat {
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        System.out.println(hasRepeated(s.nextLong()));
    }
    public static long hasRepeated(long number){
        String num=String.valueOf(number+1);
        long n;
        long result=0;
        while ((n=merge(new StringBuilder(num)))!=0){
            num= String.valueOf(n);
            result=n;
        }
        if(result==0){
            return number+1;
        }else {
            return result;
        }
    }
    public static long merge(StringBuilder s){
        for(int i=0;i
            if(s.charAt(i)==s.charAt(i+1)){
                long l=Long.parseLong(String.valueOf((s.charAt(i))+String.valueOf(s.charAt(i+1))))+1;
                int m=s.length()-2-i;//判定需要乘以10的多少次方
                s.setCharAt(i,'0');
                s.setCharAt(i+1,'0');
                for(int j=0;j
                    l*=10;
                }
                long num=l+Long.parseLong(s.toString());
                s=new StringBuilder(String.valueOf(num));
                for(int t=i+2;t
                    for(int j=0;j<2;j++){
                        if(s.charAt(t-1)!=(j+48)){
                            s.setCharAt(t, (char) (j+48));
                            break;             //如果沒有break的話,就會變成1010序列
                        }
                    }
                }
                return Long.parseLong(s.toString());
            }
        }
        return 0;
    }
}</span>



發佈了18 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章