美团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+97-i/2);
				}else{
					str[count]= (char)(i+65-i/2-1);
				}
				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=122
        char[] 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;
    } 
时间: 2024-10-10 22:54:31

美团2015校招哈尔滨站笔试题--第二题的相关文章

2015微软实习在线笔试题 - Professor Q&#39;s Software

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new software. The software consists of N modules which are numbered from 1 to N. The i-th module will be started up by signal Si. If signal Si is generated multiple times, the i-th module

js+html+css实现简单页面交互功能(2015知乎前端笔试题)http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2

js+html+css实现简单页面交互功能(2015知乎前端笔试题) http://v.youku.com/v_show/id_XMTI0ODQ5NTAyOA==.html?from=y1.7-1.2 密码:hellozhihu

2015考研 杭电 计算机学院 复试笔试题第一题 JAVA语言解法

杭电 2015年考研 计算机学院 复试笔试第一题 JAVA解法 import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /* 杭电2015年 计算机学院 复试 笔试题第一题 JAVA解答 * author 刘汪洋 QQ 605283073 * 求出:字符串如:"34223abd#34SB-11--" * 中整数的和 其中-在数字前表示负号,否则为字符 */ pub

阿里2015在线研发工程师笔试题(部分)

今天lz去阿里的在线笔试打了一把酱油,由于lz的水平有限,时间太他么紧张了.下面把记下来的题给大家分享一下.选择题总共20道,前十题截了图,后面感觉太费时就没有再截了,凭记忆记下了两道.附加题都记录下来了. 选择题 第1题: 第2题: 第3题: 第4题 第5题: 第6题: 第7题: 第8题: 第9题: 第10题: 回忆起来的题(11-20中的某2道) 1.       一个博物馆,以每分钟20人的速度进入,平均每人待20分钟,问博物馆最少需要容纳多少人? A.100 B.200  C.300 

美团2015校招研发笔试题——字母排序

题目来源牛客网: http://www.nowcoder.com/questionTerminal/3c334863c02443cdb61b2d73c1edf071?orderByHotValue=0&query=一组随机排列的字母数组&done=0&pos=9 一组随机排列的字母数组.请编写一个时间复杂度为O(n)的算法,使得这些字母按照字母从小到大顺序排好. 说明:字母区分大小写,相同的字母,排序后小写排在大写前. 例如:R,B,B,b,W,W,B,R,B,w 排序为:b,B,

2015年9月阿里校招前端工程师笔试题

前一段时间参加了阿里的9月校招,为了贯彻及时总结的精神,今天就来总结一下我做的这套题目吧. 1.下面哪段css代码通常用于页面水平居中: 1 A:site-align:center; 2 B:margin:center; 3 C:margin:auto 0; 4 D:margin:0 auto; 这题很简单,水平居中答案选D.每个选项来剖析一下, A选项在我做开发两年来,完全没有见到过,初略百度一下也没看到相关的东西:B选项,明显错误:D,其实D可以做到页面垂直居中,要怎么做呢,如下图,默认是h

2016届 360校招内推笔试题--2015.8.11

一.填空题40题,时间80分钟 和360实习的题目有一些是重复的.可以参考牛客网:http://www.nowcoder.com/. 二.两道编程题,时间70分钟,题目不是特别难,如下所示 第一道: 思路: 统计每个字符出现的次数.然后遍历一次,找到第一个出现次数为1的字符.在我的vs上调试可以通过,但是到360里面的编辑器就不行了,说是超时.从题目的hint里可以看出可能是从终端接收数据出问题.本想一个一个字符接收的,最后时间不够了.还没解决.下面贴出没有通过的代码. 代码: #include

2015年校招--华为上机笔试题--大数相乘

#include "stdafx.h" #include<string> #include<iostream> using namespace std; void add(string &sum,string temp) { int len1=sum.size(); int len2=temp.size(); int jw=0; int i,j; for(i=len1-1,j=len2-1;i>=0 && j>=0;i--,j

2015年校招--华为上机笔试题--去重复单词

#include "stdafx.h" #include<set> #include<string> #include<iostream> using namespace std; int main() { set<string> s; char buf[1000]={0}; gets(buf); char* p=buf; while(*p!=0) { if(*p==',' || *p=='.') { *p=' '; } p++; } p