2018研发岗美团笔试题目

1、第一题
题目描述:
在十进制表示中,任意一个正整数都可以用字符‘0’-‘9’表示出来。但是当‘0’-‘9’这些字符每种字符的数量有限时,可能有些正整数就无法表示出来了。比如你有两个‘1’ ,一个‘2’ ,那么你能表示出 11,12,121 等等,但是无法表示出 10,122,200 等数。

现在你手上拥有一些字符,它们都是‘0’-‘9’的字符。你可以选出其中一些字符然后将它们组合成一个数字,那么你所无法组成的最小的正整数是多少?

输入
第一行包含一个由字符’0’-‘9’组成的字符串,表示你可以使用的字符。

· 1 ≤字符串长度≤ 1000

输出
输出你所无法组成的最小正整数。

样例输入
55

样例输出
1

Hint
Input Sample 2
123456789
Output Sample 2
10
下面的代码不能被AC,只能过70%

#include
#include
#include
#include

using namespace std;

int find_num(vector<int> sort_temp_f, vector<int> num_count_temp)
{
    int i_save = 1;
    int i_s = 1;
    int i_s_y = 1;
    //vector num_count_temp_temp(num_count_temp);

    while (1)
    {
        vector<int> num_count_temp_temp(num_count_temp);
        while (i_s_y)
        {

            i_s_y = i_s % 10; //不断取余
            i_s = i_s / 10;   //不断取整
            cout << i_s << "        " << i_s_y << endl;
            if (i_s == 0 && i_s_y == 0)            //如果两个都是零,则计算下一个数,这个逻辑忘记了,,
            {
                break;
            }
            if (find(sort_temp_f.begin(), sort_temp_f.end(), i_s_y) != sort_temp_f.end() && num_count_temp_temp[i_s_y] > 0)    //如果找到了这个数,并且个数大于零(这个数字还可以拿来用)
            {
                num_count_temp_temp[i_s_y] -= 1;
            }
            else
            {
                cout << "不能合成的数是  " << i_save << endl;
                return 0;
            }

        }
        i_save++;
        i_s = i_save;
        i_s_y = 1;
    }

}

int main()
{
    string s_temp;
    vector<int> v_temp;
    vector<int>  sort_temp;
    int num_count[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    int temp_count = 0;
    int i_temp = 0;
    cin >> s_temp;
    int n;
    for (int i = 0; i'0';
        v_temp.push_back(n);
    }
    sort(v_temp.begin(), v_temp.end());


        for (int i = 0; ifor (int j = 0; j<10; ++j)           //找出每个数字的个数
            {
                if (v_temp[i] == j)
                {
                    num_count[j] += 1;
                }
            }

        }


        for (int i = 0; i < 10; ++i)
            cout << num_count[i] << endl;


    vector<int> num_count_temp;
    for (int i = 0; i < 10; ++i)                                                 //把每个数字出现的次数压入一个新的容器中
    {
        num_count_temp.push_back(num_count[i]);
    }

    int it = unique(v_temp.begin(), v_temp.end()) - v_temp.begin();            //删除重复的个数

    for (int i = 0; i < it; ++i)                                              //将没有重复的数字压入一个新的容器中
        sort_temp.push_back(v_temp[i]);

    for (int i = 0; i < num_count_temp.size(); ++i)                        
        cout << num_count_temp[i] << endl;

    cout << endl;
    find_num(sort_temp, num_count_temp);

    system("pause");
    return 0;
}

2、第二题
给出两个相同长度的由字符 a 和 b 构成的字符串,定义它们的距离为对应位置不同的字符的数量。如串”aab”与串”aba”的距离为 2;串”ba”与串”aa”的距离为 1;串”baa”和串”baa”的距离为 0。下面给出两个字符串 S 与 T,其中 S 的长度不小于 T 的长度。我们用|S|代表 S 的长度,|T|代表 T 的长度,那么在 S 中一共有|S|-|T|+1 个与 T 长度相同的子串,现在你需要计算 T 串与这些|S|-|T|+1 个子串的距离的和。

输入
第一行包含一个字符串 S。

第二行包含一个字符串 T。

S 和 T 均由字符 a 和 b 组成,1 ≤ |T| ≤ |S| ≤105 。

输出
输出对应的答案。

样例输入
aab

aba

样例输出
2

Hint
Input Sample 2
aaabb
bab
Output Sample 2
5
在样例 2 中,”aaa”与”bab”的距离为 2,”aab”与”bab”的距离为 1,”abb”与”bab”的距离为 2,
所以最后答案为 5。

#include
#include
#include

using namespace std;

int main()
{
    string a;
    string b;

    int res = 0;

    cin >> a >> b;

    int a_size = a.size();
    int b_size = b.size();

    int s_count = a_size - b_size;
    int count = 0;

    for (int i = 0; i <= s_count; ++i)
    {
        for (int j = 0; j < b_size; ++j)   //对两个字符串数组进行遍历操作,得到字符串的距离之和
        {
            if (a[i + j] != b[j])
                count++;
        }
    }
    cout << count << endl;
    system("pause");
    return 0;
}

你可能感兴趣的:(C++)