网易游戏雷火2021春招游戏研发工程师笔试题

题目输入为第一行数字: N,M,T
此后的N行,每行M个数字。
此后T行,输入r1,r2,c1,c2,S,A

题目要求:对给定的一个N行M列的数组,进行T次局部排序,输出局部排序后数组。
排序规则为,对r1行到r2行的第c1列到第c2列的数据 根据指定的第S列进行排序,如果A==0则从小到大排序,A==1则从大到小排序。
输出排序后完整的数组。
例子:

输入:
4  4  1
1  2  3  4 
5  6  7  8
9  10 11 12
13 14 15 16
2  3 2 3 3 1
输出:
1  2  3  4 
5  10 11 8
9  6  7 12
13 14 15 16

代码如下:通过率100%

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

bool compA1(vector<int> a, vector<int> b,int s) {
        return a[s] > b[s];
}

int main() {
    int N, M, T;
    cin >> N >> M >> T;
    vector<vector<int>> data(N);

    for (int i = 0; i < N;i++) {
        for (int j = 0; j < M; j++) {
            int num;
            cin >> num;
            data[i].push_back(num);
        }
    }

    while (T--) {
        int r1, r2, c1, c2;
        int s;
        int A;
        cin >> r1 >> r2 >> c1 >> c2 >> s >> A;
        int len = r2 - r1 + 1;
        int lenM = c2 - c1 + 1;
        r1 -= 1;
        c1 -= 1;
        vector<vector<int>> newdata(len);
        for (int i = 0; i < len;i++) {
            for (int j = 0; j < lenM;j++) {
                newdata[i].push_back(data[r1+i][c1+j]);
            }
        }
        s = s - c1-1;
        for (int i = 0; i < len;i++) {
            for (int j = i; j < len; j++) {
                if (A == 0) {
                    if (newdata[i][s] > newdata[j][s]) {
                        vector<int> tmp;
                        tmp = newdata[i];
                        newdata[i] = newdata[j];
                        newdata[j] = tmp;
                    }
                }
                else {
                    if (newdata[i][s] < newdata[j][s]) {
                        vector<int> tmp;
                        tmp = newdata[i];
                        newdata[i] = newdata[j];
                        newdata[j] = tmp;
                    }
                }
            }
        }
        for (int i = r1; i < r2;i++) {
            for (int j = c1; j < c2;j++) {
                data[i][j] = newdata[i - r1][j - c1];
            }
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cout << data[i][j] << " ";
        }
        cout << endl;
    }
    
    return 0;
}
上一篇:合并两个有序数组


下一篇:javascript对象的深度比较方法