黑洞数问题

黑洞数

大三,都在考虑就业的问题。想想还要不要参加蓝桥杯呢??
总结上次的经验:

  • 练习的题目不够,个人感觉在编程题的基础很是弱。
  • 逻辑思维不好,编程题是很考思维,在现有的知识上去利用,去扩展,去找规律
  • 临场发挥不好,感觉自己有种考试恐惧症,在考场上会紧张,注意力不集中等等问题。

我还是决定参加一次,即便有校内选拔,大三的名额苛刻,但是,遇到困难不可以逃避,尽力去做,才会不后悔。
打算每天一道题,一直到校内选拔。毕竟,以后去找工作,找实习的时候,一定会有笔试题,一定有编程题,现在来磨刀也不迟,让对待编程题的感觉不要那么生疏。
废话不说,直接上题:(感觉蓝桥杯,区别于acm,比较简单,用到的算法不多,但是很考逻辑,在解答的问题上如何处理。)

任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:
65432,一个最小的数23456。求这两个数字的差,得:41976,
把这个数字再次重复上述过程(如果不足5位,则前边补0)。
如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。
其中5位数全都相同则循环圈为 [0],这个可以不考虑。
循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。

思路:

  • 1.重排最大和最小,注意有0的情况。
  • 2.存储每次的结果,并判断是否为5位数。
  • 3.重复出现,在加一。4.输出,重复出现的序列。

一开始卡主在纠结字符串的处理上,如何进行转换,怎么从string到char,再到int,进行排列等,再到排序的问题,虽然有现成的包,可以直接支持排序,但是必须掌握一种排序,在这个的基础上进行修改,更加灵活。

    import java.util.Iterator;
    import java.util.Scanner;
    import java.util.TreeMap;

    public class Main{
        public static void main(String[] args){
            Scanner cin=new Scanner(System.in);
            while(cin.hasNext()){
                String str=cin.next();
                fiveHole(str,str.length());
                printLoopNum();
            }
        }
        static TreeMap<Integer, Integer> hm=new TreeMap<Integer, Integer>(); 
        public static void fiveHole(String str,int length){
            char[] chArrs=str.toCharArray();
            char ch;
            String maxStr="",minStr="";
            int differ;
            for(int i=0;i<chArrs.length;i++){
                int j=i;
                ch=chArrs[j];
                //插入排序
                while(j>0&&ch>chArrs[j-1]){
                    chArrs[j]=chArrs[j-1];
                    j--;
                }
                chArrs[j]=ch;
            }
            for(char x:chArrs){
                maxStr+=x;
            }
            //判断末尾是否为零,为零则与倒数第二个进行切换
            if(chArrs[chArrs.length-1]==0){
                chArrs[chArrs.length-1]=chArrs[chArrs.length-2];
                chArrs[chArrs.length-2]=0;
            }
            for(int i=length-1;i>=0;i--){
                minStr+=chArrs[i];
            }
            differ=Integer.parseInt(maxStr)-Integer.parseInt(minStr);
            //判断是否为5位数
            if(differ/10000==0){
                differ=differ*10;
            }
            if(isLoop(differ))
                return ;
            fiveHole(differ+"",length);
        }
        static int flag;
        public static boolean isLoop(int differ){
            if(!hm.containsKey(differ)){
                hm.put(differ, 0);
            }
            else if(hm.get(differ)>=2){
                flag=differ;
                return true;
            }
            else{
                int tmp=hm.get(differ);
    //            hm.remove(differ);
                hm.put(differ, tmp+1);
            }
            return false;
        }
        public static void printLoopNum(){
            Iterator<Integer> mIterator=hm.keySet().iterator();
            while(mIterator.hasNext()){
                int tmp=mIterator.next();
                if(hm.get(tmp)==2){
                    System.out.println(tmp);
                }
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值