【笔试题】某公司中有N名员工。给定所有员工工资的清单
排列员工工资顺序(C++map解法)
题目描述:
某公司中有N名员工。给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资。他按照工资的频次降序排列。即给定清单中所有频次较高的工资将在频次较低的工资之前出现。如果相同数量的员工都有相同的工资,则将按照给定清单中该工资第一次出现的顺序排列。
写一个算法来帮助财务人员排列员工工资的顺序。
输入:
该函数/方法的输入包括两个参数------
num,一个整数,表示员工的人数
salaries,一个正整数列表,表示N名员工的工资
输出:
返回一个正整数列表,该列表按照员工工资的频次排序。
约束条件:
1<num<100000
1<salaries<1000000000
0<i<num
示例:
输入:num=19
salaries=[10000,20000,40000,30000,30000,30000,40000,20000,50000,50000,50000,50000,60000,60000,60000,70000,80000,90000,100000]
输出:
[50000,50000,50000,50000,30000,30000,30000,60000,60000,60000,20000,20000,40000,40000,10000,70000,80000,90000,100000]
解题思路:使用map保存工资出现的频次,若没有该条工资,加入;若有该条工资,频次+1。然后遍历map找频次的最大值,根据频次吧key值加入vector中,然后删除该条记录,直到map为空。返回vector即可。
#include <map>
#include <vector> using namespace std; int main()
{
int num = ;
int *salaries = new int[]{ ,,,,,,,,,,,,,,,,,, };
vector<int> result = salaryFrequeny(, salaries);
system("pause");
return ;
} vector<int> salaryFrequeny(int num, int *salaries)
{
map<int, int> safMap;
map<int, int>::iterator iter;
for (int i = ; i < num; i++)
{
iter = safMap.find(salaries[i]);
if (iter == safMap.end())
{
safMap.insert(pair<int, int>(salaries[i], ));//没找到key值,向map加入。
}
else
{
iter->second += ;//找到key值,对应的value+1
}
}
vector<int> result;
int max = ;
int index = ;
while (safMap.size())
{
for (iter = safMap.begin(); iter != safMap.end(); iter++)//找当前频次最高的记录
{
if (iter->second > max)
{
max = iter->second;
index = iter->first;
}
}
while (max--)
{
result.push_back(index);//将频次最高的key值按频次压入vector
}
safMap.erase(index);//擦除当前频次最高的记录
}
return result;
}
【转载自】
627在线笔试题:排列员工工资顺序(C++map解法) - 懂代码的暖男 - CSDN博客
题目:排列员工工资顺序(Java和C++)(中兴在线笔试题) - 会笑的小猪的博客 - CSDN博客
题目描述:
某公司中有N名员工。给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资。他按照工资的频次降序排列。即给定清单中所有频次较高的工资将在频次较低的工资之前出现。如果相同数量的员工都有相同的工资,则将按照给定清单中该工资第一次出现的顺序排列。
写一个算法来帮助财务人员排列员工工资的顺序。
��
输入:
该函数/方法的输入包括两个参数------
num,一个整数,表示员工的人数
salaries,一个正整数列表,表示N名员工的工资
输出:
返回一个正整数列表,该列表按照员工工资的频次排序。
约束条件:
<num<
<salaries<
<i<num
��
示例:
输入:
num=
salaries=[,,,,,,,,,
,,,,,,,,,]
输出:
[,,,,,,,,,
,,,,,,,,,]
��
��
分析:本题要求把根据数据出现的频数从高到低排序,所以基本的思路是算出每个数的频次,然后直接从高到低排序。
�� �� �� �� �� ��2可是这样会出现一个问题,频次相同的数据没法排序。比如 ���� 这组数据分别得到频次 ,本身就是一个降序排序,所以最后结果还是20
�� �� �� �� �� ��2那怎么办呢?我们可以上面那种数据中间那个20为例,即20 。首先我们来判断20的前半部分是否存在20,如果存在20的话则插入到该20的后面即可,即变为20 。
�� �� �� �� �� ��2所有排序过程均使用插入排序。插入排序的详细原理读者可以自行百度,插入排序从后往前移动,移动过程中不会改变原有已经排列好的数字的顺序。
��
思路:.计算每个数的频数。
�� �� �� �� �� ��.根据频数的大小,对数据从高到低排序。排序的方法使用插入排序。
�� �� �� �� �� . 对第2部排好序的结果再排序。这次从前向后遍历,判断该数的前半部分是否存在该数,存在的话就插入到最近和它相同数的后面。 Java实现:
在线运行代码
public class salaryArrangement { public static void main(String[] args) {
int num = ;
int slalay[] = { , , , , , , , , , , , , ,
, , , , , };// 测试数据
slalay = b(num, slalay); // 保存结果
int i;
System.out.println("输出结果为:");
for (i = ; i < num; i++)// 输出结果
{
System.out.print(" ");
System.out.print(slalay[i]);
}
} public static int[] b(int num, int slalay[]) {
int i, j, k;
int temp_frequency;
int temp_slalay;
int frequency[] = new int[num]; // 频次
for (i = ; i < num; i++) // 给频次赋初值
{
frequency[i] = ;
} for (i = ; i < num; i++) // 对已排序的数据统计频次
{
for (j = ; j < num; j++) {
if (slalay[i] == slalay[j])
{
frequency[i]++;
}
}
} for (i = ; i < num; i++) // 对频次进行插入排序,同时根据频数交换的顺序排列原数据
{
temp_frequency = frequency[i];
temp_slalay = slalay[i];
j = i - ;
while (j >= && temp_frequency > frequency[j]) //频次递减排序
{
frequency[j + ] = frequency[j];
slalay[j + ] = slalay[j]; // 变换原数据
j--;
}
frequency[j + ] = temp_frequency;
slalay[j + ] = temp_slalay;
} for (i = ; i < num; i++) // 再进行一次插入排序
{
temp_slalay = slalay[i];
j = i - ;
k = i - ;
while (k >= )
{
if (temp_slalay == slalay[k]) // 判断前半部分子序列是否存在当前当前数据
{
while (j >= && temp_slalay != slalay[j]) // 插入到相同的数的后面
{
slalay[j + ] = slalay[j];
j--;
}
slalay[j + ] = temp_slalay;
break; // 退出循环判断下个数
}
k--;
} } return slalay;
}
} C++实现:
在线运行代码
#include <stdio.h> int* b(int num, int* slalay) {
int i, j, k;
int temp_frequency;
int temp_slalay;
int frequency[num]; // 频次
for (i = ; i < num; i++) // 给频次赋初值
{
frequency[i] = ;
} for (i = ; i < num; i++) // 对已排序的数据统计频次
{
for (j = ; j < num; j++) {
if (slalay[i] == slalay[j])
{
frequency[i]++;
}
}
} for (i = ; i < num; i++) // 对频次进行插入排序,同时根据频数交换的顺序排列原数据
{
temp_frequency = frequency[i];
temp_slalay = slalay[i];
j = i - ;
while (j >= && temp_frequency > frequency[j]) //频次递减排序
{
frequency[j + ] = frequency[j];
slalay[j + ] = slalay[j]; // 变换原数据
j--;
}
frequency[j + ] = temp_frequency;
slalay[j + ] = temp_slalay;
} for (i = ; i < num; i++) // 再进行一次插入排序
{
temp_slalay = slalay[i];
j = i - ;
k = i - ;
while (k >= )
{
if (temp_slalay == slalay[k]) // 判断前半部分子序列是否存在当前当前数据
{
while (j >= && temp_slalay != slalay[j]) // 插入到相同的数的后面
{
slalay[j + ] = slalay[j];
j--;
}
slalay[j + ] = temp_slalay;
break; // 退出循环判断下个数
}
k--;
} } return slalay;
} int main()
{
int num = ;
int slalay[] = { , , , , , , , , ,
, , , ,, , , , , };// 测试数据
int *slalayResult;
slalayResult = b(num, slalay); // 保存结果
int i;
printf("输出结果为:");
for (i = ; i < num; i++)// 输出结果
{
printf("%d ",slalayResult[i]);
}
}
【笔试题】某公司中有N名员工。给定所有员工工资的清单的更多相关文章
- 关于完整解答Leo C.W博客中名为“我们公司的ASP.NET 笔试题,你觉得难度如何”的所有题目
关于完整解答Leo C.W博客中名为“我们公司的ASP.NET 笔试题,你觉得难度如何”的所有题目,请大家鉴定,不足之处,敬请指教! 第1到3题解答如下: public enum QuestionTy ...
- java各公司笔试题集1
IBM笔试题 注:IBM笔试题一小时之内完成,题目全部用英文描述,这里用中文表述 一.名词解释 1.Eclipse 2.J2EE 3.EJB 4.Ajax 5.Web service 二.找出以下代码 ...
- 某公司的U3D笔试题
某公司的U3D笔试题 今天这套笔试题感觉做得一般. 随后是二对一的技术面试,但涉及的技术细节相对较少,更多的是对以前工作.项目经历的询问. 然后说今天先到这里,让我等通知. 我还特意问了一下,通知 ...
- 所在实习公司的JS笔试题
在班上无聊的时候看到了一份JS笔试题(我是电面进去的,没做过这份题~~),开始还觉得蛮简单......后来觉得还是很有意思的,贴出来一起看看. 题目一: if(!("a" in w ...
- 收藏所用C#技术类面试、笔试题汇总
技术类面试.笔试题汇总 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化,不要梦想着把题覆盖了,下面的题是供大家查漏补 ...
- 一道简单的 Java 笔试题,但值得很多人反思!
前言 面试别人,对我来说是一件新奇事,以前都是别人面试我.我清楚地知道,我在的地域与公司,难以吸引到中国的一流软件人才.所以,我特地调低了期望,很少问什么深入的技术问题,只问一些广泛的.基础的.我只要 ...
- C/C++ 笔试题
/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...
- 嵌入式Linux C笔试题积累(转)
http://blog.csdn.net/h_armony/article/details/6764811 1. 嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 ...
- C/C++笔试题(很多)
微软亚洲技术中心的面试题!!! .进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2 ...
随机推荐
- 学了 C 语言到底能做什么, 能从事什么工作?
前言 经常有小伙伴问我,你是做C/C++的,那学C语言可以做什么呢?尤其是还在学校的同学,感觉自己学了很久,什么也做不了,一度怀疑自己是不是不适合程序员这个方向. 开始我都是直接说可以开发嵌入式啊,做 ...
- openstack转移新建虚拟机存储路径
在云计算openstack中以为新建的虚拟机都存放在/var/lib/nova/instances中,在新建虚拟机时内存当然不够用,所以可以将nova转移到新的存储位置 以下操作只在计算节点上进行 一 ...
- 语法速学,返回数组 repeated修饰符
重新编写proto文件 syntax = "proto3"; package services; import "google/api/annotations.proto ...
- HTML中的标签列表
1 :基础标签 <!DOCTYPE> :定义文档类型 <title>:定义文档标题 <h1>to<h2>定义HTML标题,其中h1到h6表示字体大小依次 ...
- 脚本安装redis
#!/bin/bash read -p 'input the version you want(like 5.0.5):' version read -p 'input redis password: ...
- 阿里druid数据源配置及数据库密码加密
注意: 1.阿里默认只对用户密码解密 2.druid 1.0.16版本及以上的解密时需要同时配置publicKey 一.生成密文密码 1 前提:已经配置了jdk环境 1.生成密文密码需要准备druid ...
- cube.js 学习(三)cube.js data schema
cube.js的 data schema 类似graphql 的type 定义,但是cube.js 的data schema 更偏向于dsl, 其中抽象了进行数据分析应用开发中的东西,自己提炼了mea ...
- 100: cf 878C set+并查集+链表
$des$Berland要举行 $n$ 次锦标赛,第一次只有一个人,之后每一次会新加入一个人.锦标赛中有 $k$ 种运动项目,每个人在这 $k$ 种项目上都有一个能力值,每次会选择任意两个还未被淘汰的 ...
- 在Matlab中的plot
在Matlab中画图时,经常会使用plot函数命令.一些隐含的画图命令也默认调用plot函数命令,如spy命令,可以画出矩阵的稀疏度图形. 另外,有时为了方便,会将一些处理图形的操作和命令列在一块,命 ...
- 实现一个简易版webpack
现实 webpack 的打包产物 大概长这样(只把核心代码留下来): 实现一个简版的webpack 依葫芦画瓢,实现思路分2步: 1. 分析入口文件,把所有的依赖找出来(包括所有后代的依赖) 2. 拼 ...