package com.interview.algorithms.general; /** * Created_By: stefanie * Date: 14-8-21 * Time: 下午9:55 */ public class C1_49_BuiltClosestNumber { public static int build(int[] numbers, int K){ int[] p = getByBit(K); int[] q = new int[p.length]; int i = p.length - 1; for(; i >= 0; i--){ Integer j = find(numbers, p[i]); if(j == null){ break; } q[i] = numbers[j]; if(numbers[j] > p[i]){ for(int k = i-1; k >= 0; k--) q[k] = numbers[0]; return getNumber(q); } } for(i = i+1; i < q.length; i++){ int index = find(numbers, q[i]); if(index + 1 < numbers.length){ q[i] = numbers[index + 1]; for(int k = i-1; k >= 0; k--) q[k] = numbers[0]; return getNumber(q); } } q = new int[p.length + 1]; if(numbers[0] == 0) q[q.length - 1] = numbers[1]; for(int j = q.length - 2; j >= 0; j--) q[j] = numbers[0]; return getNumber(q); } public static int[] getByBit(int n){ int length = String.valueOf(n).length(); int[] number = new int[length]; for(int i = 0; i < length; i++){ number[i] = n % 10; n = n / 10; } return number; } public static int getNumber(int[] num){ int n = num[num.length - 1]; for(int i = num.length - 2; i >= 0; i--){ n = n * 10; n += num[i]; } return n; } public static Integer find(int[] numbers, int k){ return find(numbers, k, 0, numbers.length - 1); } public static Integer find(int[] numbers, int k, int low, int high){ if(low > high) return null; int mid = low + (high - low) / 2; if(k == numbers[mid]) return mid; else if(k > numbers[mid]) return find(numbers, k, mid + 1, high); else { Integer larger = find(numbers, k, low, mid-1); if(larger == null) return mid; else return larger; } } }