1. 程式人生 > >一些比較有意思的題目

一些比較有意思的題目

1.從一個n位數中尋找m位數,並輸出最小值

來源:面試一家創業公司的題目

Example

輸入:698592 k = 4
輸出 :6592

Solution:一種比較常見的思路是列舉全部k=4的數字,然後再取最小值,然而這樣複雜度會很高。本文的思路是不斷遞迴求得最小值,注意邊界,可以顯著降低複雜度。

void find_min_core(vector<int> vec, int k, int start, int end, vector<int>& result)
{
    if (k > 0)
    {
        int min_value = INT_MAX;
        for
(int i = start; i < end; i++) { if (vec[i] < min_value) { min_value = vec[i]; start = i+1; } } result.push_back(min_value); find_min_core(vec,k-1,start,end+1,result); } } vector<int>
find_min(vector<int> vec, int k) { vector<int> result; int start = 0; int end = vec.size() - k + 1; find_min_core(vec,k,start,end,result); return result; }

2.大整數乘法

來源:面試一家創業公司的題目

Example

輸入:str1:123456789 str2:987654321
輸出 :121932631112635269

Solution:

(1)數字字串轉換為數字陣列
(2)模擬計算,注意進位,累加操作

#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>

using namespace std;

void output_vec(vector<int> vec)
{
    if(vec.empty())
        return;
    else
    {
        for (int i = 0; i < vec.size(); i++)
        {
            cout << vec[i] << " ";
        }
        cout << endl;
    }
}

vector<int> convert_int_string_to_vector(string str)
{
    vector<int> vec;

    int length = str.length();
    char* c_s = new char[length+1];
    strcpy(c_s,str.c_str());

    while (*c_s != '\0')
    {
        vec.push_back(*c_s-'0');
        c_s++;
    }

    return vec;
}

vector<int> big_data_multiply(vector<int> str1, vector<int> str2)
{
    vector<int> result(100);
    int i,j;

    for (i = 0; i < str1.size(); i++)
    {
        int carry = 0;
        for (j = 0; j < str2.size(); j++)
        {
            int new_carry = (result[i+j] + carry + str1[i]*str2[j])/10;
            result[i+j] = (result[i+j] + carry + str1[i]*str2[j])%10;

            carry = new_carry;
        }
        if(carry > 0)
            result[i+j] += carry;
    }

    int size;
    for (size = 0; size < result.size(); size++)
    {
        if(result[size] == 0)
            break;
    }

    result.resize(size);
    reverse(result.begin(),result.end());

    return result;
}

int main()
{
    string str1 = "123456789";
    string str2 = "987654321";

    vector<int> int_str_vec1 = convert_int_string_to_vector(str1);
    vector<int> int_str_vec2 = convert_int_string_to_vector(str2);

    reverse(int_str_vec1.begin(),int_str_vec1.end());
    reverse(int_str_vec2.begin(),int_str_vec2.end());

    vector<int> result = big_data_multiply(int_str_vec1,int_str_vec2);
    output_vec(result);

    return 0;
}