Google2009华南地区笔试题
给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。比如,A=[1,0] K=21 那么输出结构应该为100。
- 一个从小到大排序的整数数组,元素都是在[0,9]之间的数字,但未必全部包含
- // 用数组中的数字(可以重复)组成一个最小的给定位数的正整数
- int generate_min_int_containing_duplicate_digit(int *array, int n, int bit_num)
- {
- // 找到最小的非零整数
- int data;
- for (int i = 0; i < n; ++i)
- {
- if (array[i] > 0)
- {
- data = array[i];
- break;
- }
- }
- for (int i = 1; i < bit_num; ++i)
- {
- data = data * 10 + array[0];
- }
- return data;
- }
- // Google2009华南地区笔试题
- // 给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),
- // 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- // 比如,A=[1,0] K=21 那么输出结构应该为100。
- int generate_min_int_greater_than_k(int *array, int n, int k)
- {
- std::sort(array, array+n);
- // high_digit: k的最高位数字
- // bit_num: k的位数
- int high_digit = k, bit_num = 1;
- while (high_digit/10 > 0)
- {
- ++bit_num;
- high_digit /= 10;
- }
- // 查找数组中比k的最高位大的最小的数字
- int i;
- for (i = 0; i < n; ++i)
- {
- if (array[i] >= high_digit)
- break;
- }
- if (i == n) // 数组中的数字都比K的最高位小
- {
- return generate_min_int_containing_duplicate_digit(array, n, bit_num+1);
- }
- else if (array[i] == high_digit)// 数组中有一位数字跟K的最高位相等
- {
- int low_data = k - high_digit * pow(10, bit_num-1);
- return array[i]*pow(10, bit_num-1)+generate_min_int_greater_than_k(array, n, low_data);
- }
- else // 数组中有一位数字比k的最高位高
- {
- int data = array[i];
- for (int j = 1; j < bit_num; ++j)
- {
- data = data * 10 + array[0];
- }
- return data;
- }
- return 0;
- }