package com.interview.flag.g; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Created_By: stefanie * Date: 15-1-9 * Time: 上午9:52 */ public class G10_ClosestNumber { public int closest(int[] options, int K){ String number = String.valueOf(K); Arrays.sort(options); List<Integer> offsets = new ArrayList(); int idx = 0; boolean isBigger = false; boolean growth = false; for(;idx < number.length(); idx++){ int cur = number.charAt(idx) - '0'; int option = searchCeil(options, cur); if(option == -1) break; offsets.add(option); if(options[option] > cur){ idx++; isBigger = true; break; } } if(!isBigger){ do{ idx--; } while (idx >= 0 && offsets.get(idx) == options.length - 1); if(idx >= 0) offsets.set(idx, offsets.get(idx) + 1); else growth = true; idx++; } while(idx < number.length()){ if(idx < offsets.size()) offsets.set(idx, 0); else offsets.add(0); idx++; } if(growth){ if(options[0] != 0) offsets.add(0, 0); else offsets.set(0, 1); } Integer result = 0; for(int j = 0; j < offsets.size(); j++){ result = result * 10 + options[offsets.get(j)]; } return result; } //if contains target, return idx of target, if not and have element larger than target, return the first element larger than target //if no element larger than target, return -1. public int searchCeil(int[] array, int target){ int low = 0; int high = array.length - 1; while(low <= high){ int mid = low + (high - low)/2; if(array[mid] == target) return mid; else if(array[mid] < target) low = mid + 1; else high = mid - 1; } return low < array.length? low : -1; } public static void main(String[] args){ G10_ClosestNumber finder = new G10_ClosestNumber(); int[] options = new int[]{0,1}; System.out.println(finder.closest(options, 21)); //100 options = new int[]{0,1,3,8}; System.out.println(finder.closest(options, 726)); //800 System.out.println(finder.closest(options, 801)); //803 System.out.println(finder.closest(options, 888)); //1000 } }