给定任意一个正整数,从1到9中选取任意数字相加的和为给定的整数,且由这些数字组成一个最大数,且相邻两数不能重复,如3的组合为21,4的组合为121。
由于相邻两数不能重复,而且组合出来的数字需要尽可能大,则第一原则是保证足够多的位数,在位数相同的情况下保证高位的数比低位的数大,由此可得出2和1来进行组合。
(1)假设最高为为1,则从给定的数值减去1。
(2)在(1)中减去1后的值中减去1或者2,由于(1)中减去1则只能减去2。
(3)重复(1)和(2)中的步骤,当给定的数值只剩 1 或者 2 时,1不做操作,如果为2则将组合的 1 和 2 的位置对调。
下面为Java代码实现
public static String max(int in) { if (in < 3) { return in+""; } int flag = 1; boolean re; StringBuilder sb = new StringBuilder(); re = doSomething(flag, in, sb, 1); if (re) { flag=2; sb = new StringBuilder(); doSomething(flag, in, sb, 2); } return sb.toString(); } private static boolean doSomething(int flag, int in, StringBuilder sb, int f) { boolean re = false; int c = in; while (c > 0) { sb.append(flag); c = c - flag; if (flag == 1) { flag = 2; } else { flag = 1; } if (f == 1 && (c < flag || c == 2)) { re = true; return re; } else if ( f == 1 && c == flag) { re = false; sb.append(c); return re; } } return re; }