一些比較有意思的題目
阿新 • • 發佈:2019-01-08
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;
}