[华为机试练习题]21.二维数组的列排序

题目

描述:     

给出一个二维数组,请将这个二维数组按第i列(i从1开始)排序,如果第i列相同,则对相同的行按第i+1列的元素排序,如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列。如果第i列到最后一列都相同,则按原序排列。 

实现以下接口:

输入一个m*n 的整数数组,实现按规则排列,返回排列后的数组。

调用者会保证:

比如输入数组为: 
1,2,3
2,3,4
2,3,1
1,3,1
按第二列排序: 
输出: 
1,2,3
2,3,1
1,3,1
2,3,4

练习阶段:    初级 

代码

/*---------------------------------------
*   日期:2015-06-30
*   作者:SJF0115
*   题目:二维数组的列排序
*   来源:华为上机
-----------------------------------------*/
#include <vector>
#include <algorithm>
#include "oj.h"
using namespace std;

// 功能:排列一个m行n列 大小的数组
// 输入: int * pArray 指向数组第一个元素的指针,m为行数, n为列数 ,请按第i列排列
// 输出:按第i列排序完成后的数组放到入参指定的地址中    (i的取值范围 1 - n)  
// 返回:

int sortIndex = 0;
int col = 0;
// 按列排序
bool cmp(const vector<int> &a, const vector<int> &b){
    for(int i = sortIndex - 1;i < col;++i){
        if(a[i] == b[i]){
            continue;
        }//for
        else{
            return a[i]<b[i];
        }//else
    }//for
    return a[col-1] < b[col-1];
}

void RangeArray(int * pArray,unsigned int  m, unsigned int  n,unsigned int  i){
    if(pArray == NULL || m <= 0 || n <= 0 || i >= n){
        return;
    }//if
    sortIndex = i;
    col = n;
    // 一行
    vector<int> rowVec;
    vector<vector<int>> matrix;
    int *array = pArray;
    // 存放在vector
    for(int i = 0; i < m; i++){
        for(int j = 0; j < n; j++){
            rowVec.push_back(*array);
            array++;
        }//for
        matrix.push_back(rowVec);
        rowVec.clear();
    }//for
    // 排序
    sort(matrix.begin(),matrix.end(),cmp);
    // 排序后的数据放入pArray
    array = pArray;
    for(int i = 0; i < m;++i){
        for(int j = 0;j < n;++j){
            *array = matrix[i][j];
            array++;
        }//for
    }//for
}



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
二维数组最大连接面指的是在一个由0和1构成的二维数组中,0与其上下左右相邻的1可以构成一个连通块,而最大连接面就是其中最大的连通块的面积。 解决这个问题可以使用深度优先搜索(DFS)算法。先对数组中的每个点进行搜索,如果该点为1且没有被访问过,则从该点出发对周围的点进行搜索。如果相邻点为1且没有被访问过,则继续从该点出发进行搜索,直到不能继续为止,返回搜索到的面积。搜索过程中需要记录每个点是否被访问过。 具体实现可以使用一个二维数组visited来记录每个点的访问状态,值为true表示已经访问过,false表示未访问。另外还需要维护一个当前连通块的面积和最大面积的变量,初始值都为0。对于每个未访问过的点,从该点出发进行DFS搜索,搜索到的面积加入当前连通块的面积,如果搜索到的面积大于当前最大面积,则更新最大面积。 实现时需要注意边界条件,例如,如果当前搜索到的点在数组边界,则不需要继续搜索该方向。同时可以使用递归或者栈实现DFS算法。 总之,二维数组最大连接面是一个比较典型的图论问题,通过DFS算法可以比较容易地解决。华为OD机试考察该问题,旨在考察应聘者对常用算法的掌握以及对数据结构的应用能力,对于求职者进一步的面试环节会是一项非常有价值的能力测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@SmartSi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值