谷歌筆試題--給定一個集合A=[0,1,3,8](該集合中的元素都是在0,9之間的數字,但未必全部包含), 指定任意一個正整數K,請用A中的元素組成一個大於K的最小正整數。

谷歌筆試題--給定一個集合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。

// 一個從小到大排序的整數數組,元素都是在[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;        
}




發佈了27 篇原創文章 · 獲贊 6 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章