这个笔试还是前天做的了,这个题目当时没有写出来,这两天抽时间做了一下,在这里跟大家分享一下。

1、 题目

2、 输入输出要求及样例
输入输出要求:

样例:

3、 我的思路
我觉得这个题目的难点在于如何将打乱之后的字符串还原成正确的单词序列。经过分析,发现复数数字对应的英文单词都有特征字母,其中0对应的ZERO的特征字母是Z,2对应的TWO的特征字母是W,4对应的FOUR的特征字母是U,6对应的SIX的特征字母是X,8对应的EIGHT的特征字母是G。将这5个数字排除之后,剩下的所有单数数字所对应的单词也可以找到特征字母了(排除5个复数之前这5个单数没办法找出特征字符),其中1对应的ONE的特征字母为O,3对应的THREE的特征字母为T,5对应的FIVE的特征字母为F,7对应的SEVEN的特征字母为S,最后剩下的就是9对应的单词NINE的字母了。
上面解决了把字符串还原成正确单词序列的问题,接下就就应该把单词转换成对应的实际的数字,然后对这些数组进行排序,最后输出即可。

4、 我的实现

import java.util.Arrays;
import java.util.Scanner;public class Ti31
{   public static void main(String[] args){Scanner scanner = new Scanner(System.in);int n = Integer.parseInt(scanner.nextLine());//获取输入数据String[] inputString = new String[n];       for(int i=0; i<n; i++){inputString[i] =  scanner.nextLine();   }//对数据进行解析for(int k=0; k<n; k++){           String get = judge(inputString[k]);         char[] getChars = get.toCharArray();Arrays.sort(getChars);      System.out.println(new String(getChars));           }   }//根据特征字母判断public static String judge(String input){String getDigitString = ""; //存放实际对应的数字while(input.length() > 0){           String key = "";if(input.contains("G"))//8{key = "EIGHT";}           else if(input.contains("Z"))//0{key = "ZERO";}           else if(input.contains("W"))//2{key = "TWO";}       else if(input.contains("U"))//4{key = "FOUR";}           else if(input.contains("X"))//6{key = "SIX";}else if(input.contains("T"))//3{key = "THREE";}else if(input.contains("O"))//1{key = "ONE";}else if(input.contains("S"))//7{key = "SEVEN";}else if(input.contains("V"))//5{key = "FIVE";}else//9{key = "NINE";}           getDigitString += getOrdinaryDigit(key);//得到以上数字后将该数字对应的字母删除input = removeChars(input,key);         }       return getDigitString;  }//根据单词,还原数字public static int getOrdinaryDigit(String input){int digit = 0;switch (input){case "ZERO":digit = 0;break;case "ONE":digit = 1;break;      case "TWO":digit = 2;      break;                  case "THREE":digit = 3;break;          case "FOUR":digit = 4;break;          case "FIVE":digit = 5;break;      case "SIX":digit = 6;break;          case "SEVEN":digit = 7;break;      case "EIGHT":digit = 8;break;case "NINE":digit = 9;      }if(digit >= 8){digit = digit - 8;}else{digit = 2 + digit;}return digit;       }   //删除相应数字对应单词的字母public static String removeChars(String input, String key){       String vaString = input;String newString = "";switch (key){case "ZERO":            newString = vaString.replaceFirst("Z", "").replaceFirst("E", "").replaceFirst("R", "").replaceFirst("O", "");break;case "ONE":newString = vaString.replaceFirst("O", "").replaceFirst("N", "").replaceFirst("E", "");break;      case "TWO":newString = vaString.replaceFirst("T", "").replaceFirst("W", "").replaceFirst("O", "");break;                  case "THREE":newString = vaString.replaceFirst("T", "").replaceFirst("H", "").replaceFirst("R", "").replaceFirst("E", "").replaceFirst("E", "");break;          case "FOUR":newString = vaString.replaceFirst("F", "").replaceFirst("O", "").replaceFirst("U", "").replaceFirst("R", "");break;          case "FIVE":newString = vaString.replaceFirst("F", "").replaceFirst("I", "").replaceFirst("V", "").replaceFirst("E", "");break;      case "SIX":newString = vaString.replaceFirst("S", "").replaceFirst("I", "").replaceFirst("X", "");break;          case "SEVEN":newString = vaString.replaceFirst("S", "").replaceFirst("E", "").replaceFirst("V", "").replaceFirst("E", "").replaceFirst("N", "");break;      case "EIGHT":newString = vaString.replaceFirst("E", "").replaceFirst("I", "").replaceFirst("G", "").replaceFirst("H", "").replaceFirst("T", "");break;case "NINE":newString = vaString.replaceFirst("N", "").replaceFirst("I", "").replaceFirst("N", "").replaceFirst("E", "");}   return newString;}   }

5、 改进思路
以上解法是笔试的时候的思路,可以看出实现起来还是很繁琐。过后我跟同学交流的时候,同学提到用统计字母出现次数的方法来解这个题目。根据这个想法,我对以上解法进行了一定的改进。主要改进的地方在于首先对各字母的出现次数进行统计,存放在Map<字母,出现次数>里。这样就可以一次性将同一个数字一次取出,而不用逐次取出。并且,取完一个数字之后,只需要将相应字母的出现次数减去相应次数,而不用对字符串进行操作,这样大大的提高了效率。

6、 改进后的实现

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Ti32
{public static void main(String[] args){Scanner scanner = new Scanner(System.in);int n = Integer.parseInt(scanner.nextLine());//获取输入数据String[] inputString = new String[n];       for(int i=0; i<n; i++){inputString[i] =  scanner.nextLine();   }//对数据进行解析for(int k=0; k<n; k++){               String digitString = judge(countCharNum(inputString[k]));char[] digitChars = digitString.toCharArray();Arrays.sort(digitChars);System.out.println(new String(digitChars));}   }//统计各个字母出现的次数public static Map<Character,Integer> countCharNum(String input){       char[] inputChar = input.toCharArray();Map<Character,Integer> charNumMap = new HashMap<>();for(char c : inputChar){if(!charNumMap.containsKey(c)){charNumMap.put(c, 1);}else{int count = charNumMap.get(c);charNumMap.put(c, count+1);         }}return charNumMap;}//根据特征字母进行匹配单词//根据特征字母判断public static String judge(Map<Character,Integer> charNumMap){String getDigitString = ""; //存放实际对应的数字while(charNumMap.size() > 0){           String key = "";int keyCount = 0;if(charNumMap.containsKey('G'))//8{key = "EIGHT";keyCount = charNumMap.get('G');                 }           else if(charNumMap.containsKey('Z'))//0{key = "ZERO";keyCount = charNumMap.get('Z');}           else if(charNumMap.containsKey('W'))//2{key = "TWO";keyCount = charNumMap.get('W');}       else if(charNumMap.containsKey('U'))//4{key = "FOUR";keyCount = charNumMap.get('U');}           else if(charNumMap.containsKey('X'))//6{key = "SIX";keyCount = charNumMap.get('X');}else if(charNumMap.containsKey('T'))//3{key = "THREE";keyCount = charNumMap.get('T');}else if(charNumMap.containsKey('O'))//1{key = "ONE";keyCount = charNumMap.get('O');}else if(charNumMap.containsKey('S'))//7{key = "SEVEN";keyCount = charNumMap.get('S');}else if(charNumMap.containsKey('V'))//5{key = "FIVE";keyCount = charNumMap.get('V');}else ///9{key = "NINE";keyCount = charNumMap.get('E');}           int  theDigit = getOrdinaryDigit(key);//根据单词还原数字for(int j=0; j<keyCount; j++){getDigitString += theDigit;}       //将相应字母的次数减去keyCountremoveChars(charNumMap, key, keyCount);}       return getDigitString;  }//根据单词,还原数字public static int getOrdinaryDigit(String input){int digit = 0;switch (input){case "ZERO":digit = 0;break;case "ONE":digit = 1;break;      case "TWO":digit = 2;      break;                  case "THREE":digit = 3;break;          case "FOUR":digit = 4;break;          case "FIVE":digit = 5;break;      case "SIX":digit = 6;break;          case "SEVEN":digit = 7;break;      case "EIGHT":digit = 8;break;case "NINE":digit = 9;      }if(digit >= 8){digit = digit - 8;}else{digit = 2 + digit;}return digit;       }   //移除该数字对应单词*keyCountpublic static void removeChars(Map<Character,Integer> charNumMap, String key, int keyCount){char[] keyChars = key.toCharArray();            for(char c : keyChars){int newCount = charNumMap.get(c)-keyCount;              if(newCount == 0){charNumMap.remove(c);}else{charNumMap.put(c, newCount);    }}}   }

7、 总结
如果看代码量,好像改进之后的方法并没有更简单,但是效率上却有非常大的提升。我用11885个字符组成的字符串进行了测试对比,解法一所耗时间为292ms,解法二所耗时间为29ms,10倍的差距。以上实现没有经过OJ平台测试,所以我也不能保证绝对正确,写在这里仅供大家参考。
以上是我的两种解法,总体感觉还是很繁琐。如果哪位大神有更好的解法,希望不吝赐教,不胜感激!

小米2017年校园招聘笔试题第三题相关推荐

  1. 腾讯2017年校园招聘笔试题第一题

    刚做完腾讯2017年校园招聘笔试题,在这里跟大家分享一下: 1. 题目 2. 我的思路 循环判断i(i从2到(输入值/2+1)),是否有满足i和(输入值-i)均为质数的情况.如果有,count加1.循 ...

  2. 腾讯2017年校园招聘笔试题第二题

    下面是腾讯2017年校园招聘笔试题第二题,在这里跟大家一起分享: 1. 题目 2. 我的思路 这题我觉得题目说的很清楚了.用类似于二分查找的方法,记录最大值.最小值和中间值,判断并记录在左区间(值为0 ...

  3. 2013年小米校园招聘笔试题(三)

    如上题目,自己设计的代码如下: /*You can mail me :wshust2007@163.com这个问题的基本思路如下:1.根据相互间的朋友关系, 二维的bitmap ,根据本题的已知条件, ...

  4. 2020.4.15华为实习招聘笔试题第三题

    很可惜,当时没做出来,写了个bug调了一个多小时,但是思路是对的. leetcode刷久了,对各种输入的处理能力不够,第一题本来很简单,也是写了一个bug把心态搞炸了.后续几乎没什么面试机会了.4月末 ...

  5. 【2017秋季校园招聘笔经面经专题汇总】

    [2017秋季校园招聘笔经面经专题汇总] 2017秋招进行时,牛妹特意为大家开放2017秋招面经专栏,同时面经活动也正在进行中,欢迎大家参与~~活动详情戳:http://www.nowcoder.co ...

  6. 2014 WAP校园招聘笔试题

    2014 WAP校园招聘笔试题 Problem's Link:   http://www.doc88.com/p-6751117015483.html WAP公司笔试题 We are planning ...

  7. 十月下旬腾讯,网易游戏,百度盛大迅雷校园招聘笔试题集锦(10.25)

    十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦 引言 笔试啊,笔试,面试啊,面试,找工作啊,找工作.此文十月百度,阿里巴巴,迅雷搜狗最新面试十一题已经整理了最新的面试题70道,本文依次整理腾讯,网 ...

  8. 2013搜狗校园招聘笔试题

    研习了Linux公社发布的2013搜狗校园招聘笔试题,还是有些收获的. //第一题:以下程序的输出是___________________ class Base { public:Base(int j ...

  9. 百度2015校园招聘笔试题

    百度2015校园招聘笔试题(自己凭记忆第一时间,记录了这么多,有些描述比较简单,请大神们补充) 一 .简答题(30分) 1. 进程和线程的联系与区别. 2. 简述数据库的存储过程及其优点. 3. st ...

最新文章

  1. 程序员必知的20个Python技巧
  2. 计算机后门做法正确的是,网络信息安全知识:张同学发现安全软件提醒自己的电脑有系统漏洞,如果你是张同学,最恰当的做法是?()...
  3. .NET Core开发日志——从ASP.NET Core Module到KestrelServer
  4. vs2019中如何创建qt项目_在VS2015中创建Qt项目【VS+Qt项目开发系列】(二)
  5. 机载计算机结构,机载计算机
  6. CXF WebService 教程
  7. poj 1734 Sightseeing trip(floyd 拓展 求最小环)
  8. 提取已有的内核配置文件
  9. oracle 获得表字段名,注释等的sql语句 .
  10. 只要是[运算] 就会提升数据类型
  11. excel不显示0_Excel2007:Excel表格中完整输入身份证号码的几种方法
  12. 简单用BT3破解无线网络WEP, WPA密码
  13. 用html制作一个中国高铁网页,行者|终于有人制作了一张靠谱的全国高铁地图!...
  14. 如何提升邮箱邮件安全性,邮箱管理制度有哪些?
  15. 红色警戒2修改器原理百科(三)
  16. 计算机画图 教学反思,画图教学反思
  17. Aerial for Mac(mac最美的鸟瞰屏幕保护程序)支持big
  18. mysql修改配置文件进行优化
  19. android语音控制歌曲播放,发条 - 支持音乐聚合搜索,歌单导入,语音控制的 APP - Android 应用 - 【最美应用】...
  20. 戏说计算机发展史,散文:戏说计算机二级考试

热门文章

  1. 苹果新手Mac OS X 使用笔记--------系统自带截屏功能快捷键巧记图
  2. SS00003.elasticsearch——|HadoopElasticSearch集中式日志分析系统.v03|——|Elasticsearch.v03|
  3. 来,认识一下,什么是地弹噪声!
  4. 影像自动解译_遥感影像解译的研究现状和发展趋势.pdf
  5. [旧文]图解nlite精简XP全过程
  6. 山西台达plc可编程控制器_什么是PLC,什么是可编程控制器,快速了解PLC常识和应用...
  7. java项目的心得体会_java设计程序心得体会
  8. win7升级正版win10方法(精华篇)!
  9. 手把手写深度学习(5)——Pytorch+RNN自动生成邓紫棋风格歌词
  10. 项目部署到阿里云无法发送邮件问题