1.给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。

1 package number; 2 3 /** 4 * 给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数。 5 * @author hasee 6 * 7 */ 8 public class repeatBit { 9 public static void main(String[] args) { 10 int NumGived = 9900; 11 System.out.println("the number1 is "+getNumNonrepetition(NumGived)); 12 System.out.println("the number2 is "+getNumNonrepetition2(NumGived)); 13 } 14 /* 15 给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数的含义是相邻两位不相同,例如1101是不重复数” 16 ++上去判断的简单方法 17 */ 18 public static int getNumNonrepetition(int NumGived) 19 { 20 int flag = 0;//为0表示该数不是“不重复数” 21 int numRepeat = NumGived; 22 int numTemp = 0;// 23 int currentBit = 0, lastBit = 0;//前后数位索引 24 while(true) 25 { 26 numRepeat++; 27 //初始化后索引 28 numTemp = numRepeat; 29 lastBit = numTemp % 10; 30 numTemp /= 10; 31 flag = 1; 32 //判断该数是不是“非重复数” 33 while(numTemp != 0) 34 { 35 currentBit = numTemp % 10; 36 numTemp /= 10; 37 if(lastBit == currentBit) 38 { 39 flag = 0; 40 break; 41 } 42 lastBit = currentBit; 43 } 44 if(flag == 1)//该数为不重复数,返回 45 { 46 return numRepeat; 47 } 48 } 49 } 50 public static int getNumNonrepetition2(int NumGived) 51 { 52 //转换为char数组来操作 53 char[] arr = String.valueOf(NumGived).toCharArray(); 54 //代表有进位后越位(就是0,1位是9,所以进位超过数组长度)的情况 55 int offside = 0; 56 //从前遍历所有位,当有相同时处理,后面的直接不用管,转换为010101~~~ 57 for (int i = 1; i < arr.length; i++) { 58 if (arr[i] == arr[i-1]) { 59 if(arr[i] != '9'){ //简单加1,然后后面直接0101 60 arr[i]++; 61 zeroAndOne(arr, i+1); 62 }else{ //相同为99时,有进位,相同的两位前一位++ 63 if (i!=1) { 64 arr[i-2]++; 65 zeroAndOne(arr, i-1); 66 }else{ //有越位情况 67 offside=1; 68 zeroAndOne(arr, 0); 69 } 70 } 71 break; 72 } 73 } 74 if(offside==0){ 75 return Integer.parseInt(new String(arr)); 76 }else //越位 77 return Integer.parseInt("1"+new String(arr)); 78 } 79 //变成0101010101 80 private static void zeroAndOne(char[] arr, int i) { 81 boolean bool = true; 82 for (int j = i; j < arr.length; j++) { 83 if (bool) { 84 arr[j] = '0'; 85 bool = false; 86 }else{ 87 arr[j] = '1'; 88 bool = true; 89 } 90 } 91 } 92 }
2.