谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
Google2009华南地区笔试题
给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。比如,A=[1,0] K=21 那么输出结构应该为100。
1 <pre name="code" class="cpp">// 一个从小到大排序的整数数组,元素都是在[0,9]之间的数字,但未必全部包含 2 // 用数组中的数字(可以重复)组成一个最小的给定位数的正整数 3 int generate_min_int_containing_duplicate_digit(int *array, int n, int bit_num) 4 { 5 // 找到最小的非零整数 6 int data; 7 for (int i = 0; i < n; ++i) 8 { 9 if (array[i] > 0) 10 { 11 data = array[i]; 12 break; 13 } 14 } 15 for (int i = 1; i < bit_num; ++i) 16 { 17 data = data * 10 + array[0]; 18 } 19 return data; 20 } 21 22 23 // Google2009华南地区笔试题 24 // 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 25 // 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 26 // 比如,A=[1,0] K=21 那么输出结构应该为100。 27 int generate_min_int_greater_than_k(int *array, int n, int k) 28 { 29 std::sort(array, array+n); 30 // high_digit: k的最高位数字 31 // bit_num: k的位数 32 int high_digit = k, bit_num = 1; 33 while (high_digit/10 > 0) 34 { 35 ++bit_num; 36 high_digit /= 10; 37 } 38 // 查找数组中比k的最高位大的最小的数字 39 int i; 40 for (i = 0; i < n; ++i) 41 { 42 if (array[i] >= high_digit) 43 break; 44 } 45 if (i == n) // 数组中的数字都比K的最高位小 46 { 47 return generate_min_int_containing_duplicate_digit(array, n, bit_num+1); 48 } 49 else if (array[i] == high_digit)// 数组中有一位数字跟K的最高位相等 50 { 51 int low_data = k - high_digit * pow(10, bit_num-1); 52 return array[i]*pow(10, bit_num-1)+generate_min_int_greater_than_k(array, n, low_data); 53 } 54 else // 数组中有一位数字比k的最高位高 55 { 56 int data = array[i]; 57 for (int j = 1; j < bit_num; ++j) 58 { 59 data = data * 10 + array[0]; 60 } 61 return data; 62 } 63 return 0;