2020大厂笔试 | 网易提前批 (2)有条件的排序数组

点击上方“Jerry的算法和NLP”,选择“星标”公众号

      重磅干货,第一时间送达

题目2. 有条件的排序数组

题目


有条件的排序数组

题目要求

   给定n个数字,a1a2a3...an,你可以对这个数组执行任意次以下交换操作:

对于数组中的两个下标i,j(1<=i.j<=n),如果ai+aj为奇数,那么就可以交换这两个数

   现在允许我们的交换次数不限,求出能够通过若干次操作后得到的数组中字典序最小的一个

example:

  {A)  

    输入 7 3 5 1    输出 7 3 5 1

(B)

输入

53941 38641 31525 75864 29026 12199 83522 58200 64784 80987

输出 12199 29026 31525 38641 53941 58200 64784 75864 80987 83522  

 

解题思路

 由于要两数相加为奇数,那么我们可以考虑以下三种情况:

  1. 全是奇数 (两数相加为偶数,两两都交换不了)

  2. 全是偶数  (两数相加为偶数,两两都交换不了)

  3. 既有奇数又有偶数 (两数相加既有奇数也有偶数,两两有些能直接交换,有些能间接交换)

   什么意思?理解好这句话,有些能间接交换。例如输入为5 6 4 3 1

我要让1排在最前面,1和5之间可以直接交换吗?不可以,但是1和5之间可以通过一个偶数(4)来进行间接交换。

   所以当一个数组输入既有偶数又有奇数那么他就是可以任意交换的了。

   理解好思路代码也就不难实现了

C

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <cstring>
#include <cmath>
 
const int N = 1e5 + 10;
 
int a[N];
 
using namespace std;
int main()
{
    int n;
    cin >> n;
    int odd = 0,even = 0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        if(a[i]%2==0)
            even++;
        else
            odd++;
    }
    if(even>0 && odd>0)
        sort(a,a+n);
    for(int i=0;i<n;i++)
    {
        printf("%d%c", a[i], i == n - 1 ? '\n' : ' ');
    }
    return 0;
}

后记

2020大厂笔试 | 网易提前批(1) 

数据结构类题目

具体算法类题目

  • 斐波那契数列

    • 007-斐波拉契数列

    • 008-跳台阶

    • 009-变态跳台阶

    • 010-矩形覆盖

  • 搜索算法

    • 001-二维数组查找

    • 006-旋转数组的最小数字(二分查找)

    • 037-数字在排序数组中出现的次数(二分查找)

  • 全排列

    • 027-字符串的排列

  • 动态规划

    • 030-连续子数组的最大和

    • 052-正则表达式匹配(我用的暴力)

  • 回溯

    • 065-矩阵中的路径(BFS)

    • 066-机器人的运动范围(DFS)

  • 排序

    • 035-数组中的逆序对(归并排序)

    • 029-最小的K个数(堆排序)

    • 029-最小的K个数(快速排序)

  • 位运算

  • 其他算法

    • 002-替换空格

    • 013-调整数组顺序使奇数位于偶数前面

    • 028-数组中出现次数超过一半的数字

    • 031-整数中1出现的次数(从1到n整数中1出现的次数)

    • 032-把数组排成最小的数

    • 033-丑数

    • 041-和为S的连续正数序列(滑动窗口思想)

    • 042-和为S的两个数字(双指针思想)

    • 043-左旋转字符串(矩阵翻转)

    • 046-孩子们的游戏-圆圈中最后剩下的数(约瑟夫环)

    • 051-构建乘积数组

剑指offer刷题交流群

扫码添加微信,一定要备注研究方向+地点+学校+昵称(如机器学习+上海+上交+汤姆),只有备注正确才可以加群噢。

 ▲长按加群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值