首页 > 8.21日 滴滴笔试
头像
拱白菜的阿秀
编辑于 2020-08-21 20:50
+ 关注

8.21日 滴滴笔试

1、设a,b,c是0到9之间的整数(其中a,b,c互不相同),
其中abc和acc是两个不同的三位数,现给定一正整数n,
问有多少对abc和acc能满足abc+acc=n(a≠0)?
输入描述
一个正整数n(100<n<2000)。
输出描述
第一行输出有多少对满足要求的数字。
接下来每一行输出一对abc和acc,以空格分隔。
如果没有一对abc和acc的话,则直接输出0即可。如果有多对,请按照abc升序的次序输出。
样例输入
1068
样例输出
1
524 544

#include <iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;



bool compare(const pair<int, int>& a, const pair<int, int>& b) {
    return a.first < b.first;
}
int main()
{
    int n;
    cin >> n;
    int sumAbc=1,sumAcc=1;
    vector<pair<int, int>> result;
    for (int i = 1; i <= 9; ++i) {
        sumAbc = i;
        sumAcc = i;
        for (int j = 0; j <= 9; ++j) {
            if (j == i) continue;    

            int sumAbc2 = sumAbc * 10 + j;
            int sumAcc2 = sumAcc;
            for (int k = 0; k <= 9; ++k) {
                if (k == i || k == j) continue;
                
                int sumAbc3 = sumAbc2 * 10 + k;
                int sumAcc3 = sumAcc2 * 10 + k;
                sumAcc3 = sumAcc3 * 10 + k;
                if (sumAbc3 + sumAcc3 == n)
                    result.push_back(make_pair(sumAbc3, sumAcc3));

            }
        }
    }
    if (result.size() > 0) {
        sort(result.begin(), result.end(), compare);
        cout << result.size() << endl;
        for (auto& a : result) {
            cout << a.first << " " << a.second << endl;
        }
    }
    else {
        cout << 0 << endl;
    }

    return 0;
}
2、小明昨晚做了一个梦。在梦里,很多很多斐波那契数连成了一条蛇。突然,最大的那个数变成了蛇头,把小明一口给吞到肚子里去了。

小明被吓醒了,他赶紧拿笔在纸上面画了一条斐波那契蛇。

这是一个蛇形迂回的斐波那契数列,它是一个n*n的矩阵,在上面的矩阵中n=3。第1行第1列是最大值,然后按照顺时针的次序数字逐渐变小。

下面是n=4时的情况:

小明希望你能够编写一个程序,输入一个正整数n,然后逐行逐列输出斐波那契蛇形矩阵中的元素。


输入描述
单组输入,输入数据占一行,包含一个正整数n,表示斐波那契蛇形矩阵的大小。(n<10)

输出描述
输出数据占一行,逐行逐列(从第1行开始到第n行,每一行从第1列开始到第n列)输出斐波那契蛇形矩阵中的元素,每两个数字之间用一个空格隔开。

样例输入
3
样例输出
34 21 13
1 1 8
2 3 5
#include <iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;


int main()
{
    
    int n;
    cin >> n;
    if (n == 1) {
        cout << 1 << endl;
        return 0;
    }
    
    vector<size_t> nums(n*n,0);
    nums[0] = 1;
    nums[1] = 1;
    for (int i = 2; i < n * n; ++i) {
        nums[i] = nums[i - 1] + nums[i - 2];

    }

    reverse(nums.begin(), nums.end());
    vector<vector<size_t>> result(n, vector<size_t>(n, 0));

    int up = 0, bottom = n - 1, right = n - 1,left = 0,index = 0;
    while (up <= bottom  && left <= right) {
        for (int i = left; i <= right; ++i) {
            result[up][i] = nums[index++];
        }
        up++;
        if (up > bottom && left > right) break;


        for (int i = up; i <= bottom; ++i) {
            result[i][right] = nums[index++];
        }
        right--;
        if (up > bottom&& left > right) break;


        for (int i = right; i >= left; --i) {
            result[bottom][i] = nums[index++];
        }
        bottom--;
        if (up > bottom&& left > right) break;


        for (int i = bottom; i >= up; --i) {
            result[i][left] = nums[index++];
        } 
        left++;

    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << result[i][j];
            if (j != n - 1)cout << " ";
            else
                cout << endl;
        }
    }


    return 0;
}
两道全A,不难,比大疆和顺丰的简单。


全部评论

(5) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐