美团2015校招哈尔滨站笔试题--第二题
有一组随机排列的字母数组,请编写一个时间复杂度为O(n)的算法,使得这些字母按照字母从小到大顺序排好。
说明:字母区分大小写,相同的字母,排序后小写排在大写前。
例如:R,B,B,b,W,W,B,R,B,w
排序后:b,B,B,B,B,R,R,w,W,W
1)描写思路(2分)
2)请用你熟悉的编程语言编写代码实现(8分)
/*** * @author 无心流泪* 空间换时间*/
public class InterviewExercise {public void mySort(char[] str){int[] hash = new int[52];for(int i=0;i<str.length;i++){if(str[i]>=97) {int key = str[i] - 97;hash[key*2]++; }else{int key = str[i] - 65;hash[key*2+1]++;}}int count = 0;for(int i=0;i<52;i++){while(hash[i]!=0){if(i%2==0){str[count]= (char)(i/2+97);}else{str[count]= (char)((i-1)/2+65);}hash[i]--;count++;}}}public static void main(String[] args) {char[] characterArray = {'R','B','B','b','W','W','B','R','B','w'};new InterviewExercise().mySort(characterArray);for(int i=0;i<characterArray.length;i++)System.out.print(characterArray[i]+" ");}}
思路很简单,开一个52的int数组,顺序代表a,A,b,B,c,C,d..........z,Z这些字母出现的次数;然后再依次打印出数组中保存的字母就可以了,采取空间换时间的hash策略。
下面的代码是字符比较的另一种方式,感觉更好点,来自http://www.dy1280.com/thread-440-1-1.html
public static void main(String[] args) {// A=65,Z=90 a=97,z=122char[] src = { 'R', 'B', 'B', 'b', 'W', 'W', 'B', 'R', 'B', 'w' };src = sortCharsOn(src);for (char c : src) {System.out.print(c + " ");}}/*** O(n)的时间复杂度对给定的字符数组进行排序* * @param src* 原数组* @return 排序后的数组*/private static char[] sortCharsOn(char[] src) {int[] items = new int[54];// 用于保存52个字符char[] des = new char[src.length];for (int i = 0; i < src.length; i++) {if (src[i] < 'z' && src[i] > 'a') { // 小写对应于items中下标为偶数items[(src[i] - 'a') * 2]++;} else if (src[i] < 'Z' && src[i] > 'A') { // 大写对应于items中下标为奇数items[(src[i] - 'A') * 2 + 1]++;}}int index = 0;for (int i = 0; i < items.length; i++) {if (items[i] != 0) {// items[i],就是该字符出现的次数if (i % 2 == 0) {for (int j = 0; j < items[i]; j++) {des[index++] = (char) (i / 2 + 'a');// 转化成小写 }} else {for (int j = 0; j < items[i]; j++) {des[index++] = (char) ((i - 1) / 2 + 'A');// 转化成大写 }}}}return des;}
转载于:https://www.cnblogs.com/wuxinliulei/p/3979990.html
美团2015校招哈尔滨站笔试题--第二题相关推荐
- 蘑菇街2015校招 Java研发笔试题 详解,2015java
蘑菇街2015校招 Java研发笔试题 详解,2015java 1. 对进程和线程描述正确的是( ) A. 父进程里的所有线程共享相同的地址空间,父进程的所有子进程共享相同的地址空间. B. 改变 ...
- 腾讯2017年校园招聘笔试题第二题
下面是腾讯2017年校园招聘笔试题第二题,在这里跟大家一起分享: 1. 题目 2. 我的思路 这题我觉得题目说的很清楚了.用类似于二分查找的方法,记录最大值.最小值和中间值,判断并记录在左区间(值为0 ...
- 阿里笔试题第二题之-------容错技术
阿里笔试题第二题之---容错技术 定义:容错就是当由于种种原因在系统中出现了数据.文件损坏或丢失时,系统能够自动将这些损坏或丢失的文件和数据恢复到发生事故以前的状态,使系统能够连续正常运行一种技术. ...
- 美团点评校招前端方向笔试题
1. 请按顺序写出打印结果,并说明原因. var name = 'global'; var obj = {name: 'local',foo: function(){this.name = 'foo' ...
- 美团2020校招前端方向笔试题
1.简答题1 答案: 1. i,s,a都在栈中,new出来的对象A在堆上. 2. 执行完后a.i的值还是字符串op. 解析: 1.考察js堆与栈:栈内存主要用于存储各种基本类型的变量,包括Boolea ...
- 巨人网络2015校招-产品专员笔试题
一.选择题 1. 6(9)3 11(12)7 15(27)16 20(21)13 25()17 2. 甲乙同时做一项工作,内容相同,效率不同.开始时约定给甲2100 ...
- 百度2019校招计算机视觉方向笔试题
百度2019校招计算机视觉方向笔试题 第一题:K-means聚类 第二题:相机模型 第三题:自动驾驶 第四题:目标检测 第一题:K-means聚类 关于K-means聚类算法,请回答以下问题: K-m ...
- 数据分析真题日刷 | 京东2019校招数据分析工程师笔试题
今日真题 网易2018校园招聘数据分析工程师笔试卷(来源:牛客网) 题型 客观题:单选51道,不定项选择12道 完成时间 120分钟 牛客网评估难度系数 3颗星 ❤️ 「更多数据分析真题」 <数 ...
- 转】阿里哈尔滨2014笔试题及【原创】答案
2014哈尔滨阿里笔试题 1. 单选题 1. 假设把整数关键码K散列到N个槽列表,以下哪些散列函数是好的散列函数 A: h(K)=K/N; B: h(K)=1; C: h(K)=K mod N; D: ...
最新文章
- python cx_oracle 有超时的设置吗_python cx_Oracle的基础使用方法(连接和增删改查)
- Reporting Services 的多值参数究竟能否用在数据集获取途径为存储过程的情景呢?...
- 一图看懂BCH和BTC的区块费用差距到底有多大?
- 「递归」第8集 | 当敲代码的手开始写歌,玩跨界的程序员有多野?
- mysql登陆 慢_mysql登陆慢问题解决
- gstat | 空间插值(二)——克里金插值之普通克里金
- 案例解析|政府信息化的BI建设应用
- python 调用dll中c或c++语言带指针,数组方法
- dsoframer java_word在线编辑--------dsoframer.ocx 的使用(java 代码)
- postSQL 正则表达式与like使用
- go语言两个json对比
- WTK6900H语音识别单芯片实现智能语音识别蓝牙耳机方案设计
- 禁止Unity3D中的物体碰撞后旋转
- jQuery DOM操作 实现本地表格查询
- 24种游戏化设计工具
- 基于微信小程序的单词记忆系统(Java+SSM+MySQL)
- 个人永久性免费-Excel催化剂功能第60波-数据有效性验证增强版,补足Excel天生不足...
- 报表工具对比选型系列用例——多源分片报表
- 微信支付 body不是UTF编码格式
- 文本自动摘要工具 TextTeaser 开源
热门文章
- python2中如何得到一级域名
- linux上安装spark_hadoop_java_scala
- 多分类可以分成多个独立的模型来训练
- 2016计算机课程设计,2016年计算机组成原理课程设计-硬布线控制器的设计.doc
- ajax传递excel后台接收,前端上传EXCEL文件,后台servlet怎么获取EXCEL中的数据
- wifi android系统耗电,魅族mx4 pro耗电严重是什么原因?异常费电元凶居然是WiFi
- html相对路径载入页面,html页面的绝对路径和相对路径
- window.location跳转页面
- redis.conf 配置项说明
- ElementUI中弹窗使用textarea原样显示SpringBoot后台带换行的StringBuilder内容