华为实习校招笔试题目2018

#第一题
##题目描述:给你一个原始字符串,根据读字符串内每个字符出现的次数,按照ASCII码递增顺序重新调整输出。
###举例:假设原始字符串为eeefgghhh,则每种字符出现的次数分别为:eee(3),f(1),gg(2),hhh(3),重新输出后的字符串如下:efghegheh。编写程序,实现上述功能。[注意](1)原始字符串中仅可能出现“数字”和“字母”;(2)请注意区分字母大小写。
####代码如下:
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
    string str;
    while (cin >> str)
    {
        map<char, int> m;
        for (size_t i = 0; i < str.size(); ++i)
        {//出现的字符,个数累加
            if (m.count(str[i]) == 0)
                m[str[i]] = 1;
            else
                m[str[i]]++;
        }
        int flag = 1;
        while (flag)
        {//map具有弱排序性
            for (map<char, int>::iterator iter = m.begin(); iter != m.end(); ++iter)
            {
                if (iter->second != 0)
                {
                    cout << iter->first;
                    iter->second--;
                }
            }
            //判断是否将所有字符输出
            map<char, int>::iterator iter;
            for (iter = m.begin(); iter != m.end(); ++iter)
            {
                if (iter->second != 0)
                {
                    flag = 1;
                    break;
                }
            }
            if (iter == m.end())
                flag = 0;
        }
    }
    return 0;
}
#第二题
##题目描述:给出一组整数,你从第一个数向最后一个数方向跳跃,每次至少跳跃1格,每个数的值表示你从这个位置可以跳跃的最大长度,计算如何以最少的跳跃次数跳到最后一个数。
###输入描述:
####第一行表示有多少个数n
####第二行开始依次是1到n个数,一个数一行
###输出描述:
####输出一行,表示最少跳跃的次数。
###示例:输入:7 2 3 2 1 2 1 5, 输出为3
####代码:解法一:动态规划
####思路解析:从最后一个数向前查找,依次找到到最后一个数的跳跃次数
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;    //数组个数
int jump(int *arr)
{
    if (arr == nullptr || n == 0)
        return 0;
    int jump = 0;
    int cur = 0; 
    int next = 0;
    for (int i = 0; i < n; ++i)
    {
        if (cur < i)
        {
            jump++;
            cur = next;
        }
        next = max(next, i + arr[i]);
    }
    return jump;
}
int main()
{
    while (cin >> n)
    {
        int *arr = new int[n];
        for (int i = 0; i < n; ++i)
            cin >> arr[i];
        cout << jump(arr) << endl;
    }
    return 0;
}
####解法二:非动态规划
####思路解析:由前往后推导
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;    //数组个数
int jump(int *arr)
{
    if (arr == nullptr || n == 0)
        return 0;
    int jump = 0;
    int cur = 0; 
    int next = 0;
    for (int i = 0; i < n; ++i)
    {
        if (cur < i)
        {
            jump++;
            cur = next;
        }
        next = max(next, i + arr[i]);
    }
    return jump;
}
int main()
{
    while (cin >> n)
    {
        int *arr = new int[n];
        for (int i = 0; i < n; ++i)
            cin >> arr[i];
        cout << jump(arr) << endl;
    }
    return 0;
}
#第三题
##题目描述:编写“长整数相乘”程序,实现两个任意长度的长整数(正数)相乘,输出结果
###输入描述:第一行输入数字A的字符串,字符范围(0~9),第二行输入数字B的字符串,字符范围(0~9)。
###输出描述:输出A、B两数相乘的结果,结果为字符串。
###示例:输入:1234, 4321; 输出:53321114
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
vector<int> multi(vector<int> &num1, int size1, vector<int> &num2, int size2)
{
    int size = size1 + size2;
    vector<int> res(size, 0);
    //一共有size - 1个数据存放在res中
    for (int i = size1 - 1; i >= 0; --i)
    {
        int k = size1 - 1 - i;
        for (int j = size2 - 1; j >= 0; --j)
        {
            res[k++] = num1[i] * num2[j];
        }
    }
    //进位处理
    for (size_t i = 0; i != size-1; ++i)
    {
        if (res[i] >= 10)
        {
            res[i + 1] = res[i] / 10 + res[i + 1];
            res[i] = res[i] % 10;
        }
    }
    //对最高位进行判断,是否需要去掉0
    if (res[size - 1] == 0)
        res.pop_back();
    //进行反向处理
    reverse(res.begin(), res.end());
    return res;
}
int main()
{
    string str1, str2;
    while (cin >> str1 >> str2)
    {
        int n = str1.size();
        int m = str2.size();
        vector<int> num1;
        for (auto e : str1)
            num1.push_back(e - '0');
        vector<int> num2;
        for (auto e : str2)
            num2.push_back(e - '0');
        vector<int> res;
        res = multi(num1, n, num2, m);
        copy(res.begin(), res.end(), ostream_iterator<int>(cout));
        cout << endl;
    }
    return 0;
}

对于第三题中的大整数相乘还可考虑用分治法来求解,其时间复杂度更低;另外对于大整数除法的题目也应该值得考虑。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值