【备战秋招】每日一题:华东师范大学保研机试-2022-整数排序

news/2024/7/20 16:58:24 标签: c++, 算法, 开发语言, 华为od, java

为了更好的阅读体检,可以查看我的算法学习博客华东师范大学保研机试-2022-整数排序

题目内容

输入若干个int类型整数,将整数按照位数由大到小排序,如果位数相同,则按照整数本身从小到大排序。

例如,

输入:10 -3 1 23 89 100 9 -123

输出:-123 100 10 23 89 -3 1 9

输入的整数个数最多不超过10^6个。

输入格式

在一行中输入若干个整数,整数之间用一个空格分隔。

输出格式

在一行中输出排序好的整数,整数之间用一个空格分隔。

样例

input1

10 -3 1 23 89 100 9 -123

ouput1

-123 100 10 23 89 -3 1 9

input2

1 -2 12

ouput2

12 -2 1

题解

思路

1.这是一类经典的条件排序问题,它就是排序问题的小变形。具体到语法上就是一个结构体排序

2.由于题目说明了数组长度n=10^6。所以就不要自己写冒泡排序等比较慢的排序了。在C++可直接使用STL中的排序函数函数:sort()。而且就算是你会手写快排,也不建议这么做。因为一方面是比赛的时候浪费时间,另一方面是STL中的sort加了很多优化,它比你手写的快排还会更快。

使用方法

// 1.需要的头文件
#include <algorithm>
// 如果不想记这么多繁杂的头文件,你永远可以相信<万能头文件>,它包罗万象了,至少各种比赛,机试是够用的。
#include <bits/stdc++.h>
​
// 2.sort的使用方法
sort (起始地址,结束地址的下一位,自定义排序函数的函数名)
// 起始/结束地址:传入对应的指针,一定要注意是结束的地址的下一位!
// 自定义排序函数:告诉sort函数将如何比较两个数,谁放在前面,谁放在后面。不传参时默认是升序排序。
​
// 3.具体案例1:给定一个整数数组a,我们希望对其下标为[l,r]的区域<升序>排序
sort(a + l , a + r + 1)

Copy

回到这道题,它的关键其实就是构造自定义排序函数。我们来展开讲一讲这一点。

//具体案例2:给定一个整数数组a,我们希望对其下标为[l,r]的区域<降序>排序
​
//这时我们可以自己构造一个自定义排序的函数cmp(函数名随意命名),然后将函数名填入第三个参数(这个在语法上叫做函数传参,本质是传递函数指针)
sort(a + l , a + r + 1 , cmp);
​
​
// 返回值为bool型,传入两个参数a , b
// 这个函数的作用是告诉sort函数将如何比较两个数。当返回true的时候将a放在b之前,返回false的时候将b放在a之前
bool cmp (const int& a , const int& b){
    //if (a > b) return true;
    //else return false;
    //利用语法特性,直接返回逻辑表达式
    return a > b;
}
​
// 更多解释:1.利用引用变量是为了加快速度,减少拷贝时间。2.使用const修饰是为了防止我们误改内容。
//所以你不加这两个,直接写int a , int b 也不会有问题,只是不规范罢了。

Copy

所以这题的关键就是构造自定义排序函数cmp。代码如下:

#include <bits/stdc++.h>
using namespace std;
struct Val{
    int dig; // 数位长度
    int val; // 数字
};
Val a[1000006];
// 获得数位长度
int getDig (int val){
    val = abs(val);
    int ans = 0;
    while (val){
        ans ++;
        val /= 10;
    }
    return ans;
}
int cmp (const Val & a , const Val& b){
    if (a.dig != b.dig)
        return a.dig > b.dig;
    return a.val < b.val;
}
int main() {
    int x , n = 0;
    while (cin >> x) {
        a[++n].val = x;
        a[n].dig = getDig(a[n].val);
    }
    sort(a + 1 , a + n + 1 , cmp);
    for (int i = 1 ; i <= n ; i++){
        cout << a[i].val;
        if (i == n) cout << endl;
        else cout << " ";
    }
    return 0;
}

Copy

总结

考察知识点:条件排序问题

评价:这是机试第一题,难度比较小。如果平时有在刷题应该是能秒掉的。


http://www.niftyadmin.cn/n/445903.html

相关文章

某农业大学c/c++第三次实验

1.3-20 递归求和 【问题描述】 请编制递归函数计算 sn123……n&#xff0c;并在main函数中调用它。 【输入形式】 一行一个整数n 【输出形式】 求和的结果 【样例输入】 5 【样例输出】 15 【评分标准】 要求使用递归实现 #include<bits/stdc.h> using namespace std;…

Tcl常用命令备忘录-正则命令篇

正则表达式是一种用于匹配、查找、替换文本中特定模式的工具。在Tcl脚本中&#xff0c;可以使用正则表达式对字符串进行匹配、查找和替换。 regexp 语法&#xff1a; regexp ?选项? 正则表达式 字符串 ?变量1 变量2 ...? 其中&#xff0c;?选项?为可选项&#xff0c;…

手写Spring框架---AOP实现

目录 容器是OOP的高级工具 系统需求 关注点分离Concern Separation 原有实现 AOP的成员 Advice的种类 单个Aspect的执行顺序 多个Aspect的执行顺序 Introduction-引入型Advice 代理模式 JDK动态代理 Spring AOP的实现原理之JDK动态代理 Spring AOP的实现原理之CGL…

【数据库与身份认证】课程笔记

目标&#xff1a; 知道如何配置MySQL数据库环境认识并使用常见的SQL语句操作数据库在Express中操作MySQL数据库了解Session的实现原理了解JWT的实现原理 目录&#xff1a; 数据库的基本概念安装并配置MySQLMySQL的基本使用在Express中操作MySQL前后端的身份认证 一. 数据库的…

JMH实战

引言 性能调优一直是工作中很重要的必会技能&#xff0c;如何知晓自己写代码的优劣呢&#xff1f;当然是看代码运行时间&#xff0c;时间越短&#xff0c;说明代码越优。 不太严谨的方法1&#xff1a; long startTime System.currentTimeMillis(); long endTime System.cu…

lmbench编译

Lmbench是一款用于测试计算机系统性能的工具。下面是关于如何编译Lmbench的基本步骤&#xff1a; 下载Lmbench源代码&#xff1a;你可以从Lmbench的官方网站 或者其他可靠的源获取网站下载Lmbench的源代码。将源代码保存到你的计算机上的一个合适的目录中。 解压源代码&#x…

Java实现图片的上传和显示

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 文章目录 &#x1f388;前言&#x1f384;前端&#xff1a;&#x1…

Codeforces Round 875 (Div. 2) 题解

总结&#xff1a;A题挺简单的&#xff0c;秒出&#xff0c;B题卡了好久。。。因为忘了一个条件&#xff0c;确实忘记考虑了。。。让别人看出来的。。。C题。。额。。DFS&#xff0c;CF1500分以下很少见到算法题了&#xff0c;这次也写的特别别扭&#xff0c;看了好久才明白。。…