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;
}