黑洞数
大三,都在考虑就业的问题。想想还要不要参加蓝桥杯呢??
总结上次的经验:
- 练习的题目不够,个人感觉在编程题的基础很是弱。
- 逻辑思维不好,编程题是很考思维,在现有的知识上去利用,去扩展,去找规律
- 临场发挥不好,感觉自己有种考试恐惧症,在考场上会紧张,注意力不集中等等问题。
我还是决定参加一次,即便有校内选拔,大三的名额苛刻,但是,遇到困难不可以逃避,尽力去做,才会不后悔。
打算每天一道题,一直到校内选拔。毕竟,以后去找工作,找实习的时候,一定会有笔试题,一定有编程题,现在来磨刀也不迟,让对待编程题的感觉不要那么生疏。
废话不说,直接上题:(感觉蓝桥杯,区别于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);
}
}
}
}