小米面试题:手机分身,电话号码隐藏。

小米面试题:
  手机分身,电话号码隐藏。
  0-9分别对应ZERO,ONE,TWO,...,NINE
  为保证手机拨号安全性,拨号后,存为对应的字符串,并打乱顺序,保证安全性。
  现在给定一个字符串,求最小的数字组合
例:
  TWOONE
  OTNWOE
  12
  12
分析:

关键字搜索:  第一次 第二次 第三次
0 ZERO Z    
1 ONE   O  
2 TWO W    
3 THREE   R  
4 FOUR U    
5 FIVE   F  
6 SIX X    
7 SENVE   S  
8 EIGHT G    
9 NINE     I/E


代码实现如下:

  1 #include "stdafx.h"
  2 #include<string>
  3 #include<iostream>
  4 using namespace std;
  5 
  6 int main()
  7 {
  8     int zidian[26],number[10];
  9     memset(zidian,0,26*sizeof(int));
 10     memset(number,0,10*sizeof(int));
 11     string numberString;
 12     while(cin >> numberString)
 13     {//while循环,无限获取测试用例
 14         for (int i = 0; i < numberString.size(); i++)
 15         {//for循环建立字典索引,直接针对字典查,而不再单个搜索。
 16             char tempChar = numberString[i];
 17             zidian[(int)tempChar - 65] += 1; 
 18         }
 19         int tempNum;
 20         //查找0 ZERO Z
 21         if(zidian[(int)'Z' - 65] != 0)
 22         {
 23             tempNum = zidian[(int)'Z' - 65];
 24             zidian[(int)'Z' - 65] = 0;
 25             zidian[(int)'E' - 65] -= tempNum;
 26             zidian[(int)'R' - 65] -= tempNum;
 27             zidian[(int)'O' - 65] -= tempNum;
 28             number[0] = tempNum;
 29         }
 30         //查找2 TWO W
 31         if(zidian[(int)'W' - 65] != 0)
 32         {
 33             tempNum = zidian[(int)'W' - 65];
 34             zidian[(int)'W' - 65] = 0;
 35             zidian[(int)'T' - 65] -= tempNum;
 36             zidian[(int)'O' - 65] -= tempNum;
 37             number[2] = tempNum;
 38         }
 39         //查找4 FOUR U
 40         if(zidian[(int)'U' - 65] != 0)
 41         {
 42             tempNum = zidian[(int)'U' - 65];
 43             zidian[(int)'U' - 65] = 0;
 44             zidian[(int)'F' - 65] -= tempNum;
 45             zidian[(int)'R' - 65] -= tempNum;
 46             zidian[(int)'O' - 65] -= tempNum;
 47             number[4] = tempNum;
 48         }
 49         //查找6 SIX X
 50         if(zidian[(int)'X' - 65] != 0)
 51         {
 52             tempNum = zidian[(int)'X' - 65];
 53             zidian[(int)'X' - 65] = 0;
 54             zidian[(int)'S' - 65] -= tempNum;
 55             zidian[(int)'I' - 65] -= tempNum;
 56             number[6] = tempNum;
 57         }
 58         //查找8 EIGHT G
 59         if(zidian[(int)'G' - 65] != 0)
 60         {
 61             tempNum = zidian[(int)'G' - 65];
 62             zidian[(int)'G' - 65] = 0;
 63             zidian[(int)'E' - 65] -= tempNum;
 64             zidian[(int)'I' - 65] -= tempNum;
 65             zidian[(int)'H' - 65] -= tempNum;
 66             zidian[(int)'T' - 65] -= tempNum;
 67             number[8] = tempNum;
 68         }
 69         //查找1 ONE O
 70         if(zidian[(int)'O' - 65] != 0)
 71         {
 72             tempNum = zidian[(int)'O' - 65];
 73             zidian[(int)'O' - 65] = 0;
 74             zidian[(int)'N' - 65] -= tempNum;
 75             zidian[(int)'E' - 65] -= tempNum;
 76             number[1] = tempNum;
 77         }
 78         //查找3 THREE R
 79         if(zidian[(int)'R' - 65] != 0)
 80         {
 81             tempNum = zidian[(int)'R' - 65];
 82             zidian[(int)'R' - 65] = 0;
 83             zidian[(int)'T' - 65] -= tempNum;
 84             zidian[(int)'H' - 65] -= tempNum;
 85             zidian[(int)'E' - 65] -= 2 * tempNum;
 86             number[3] = tempNum;
 87         }
 88         //查找5 FIVE F
 89         if(zidian[(int)'F' - 65] != 0)
 90         {
 91             tempNum = zidian[(int)'F' - 65];
 92             zidian[(int)'F' - 65] = 0;
 93             zidian[(int)'I' - 65] -= tempNum;
 94             zidian[(int)'V' - 65] -= tempNum;
 95             zidian[(int)'E' - 65] -= tempNum;
 96             number[5] = tempNum;
 97         }
 98         //查找7 SEVEN S
 99         if(zidian[(int)'S' - 65] != 0)
100         {
101             tempNum = zidian[(int)'S' - 65];
102             zidian[(int)'S' - 65] = 0;
103             zidian[(int)'E' - 65] -= 2 * tempNum;
104             zidian[(int)'V' - 65] -= tempNum;
105             zidian[(int)'N' - 65] -= tempNum;
106             number[4] = tempNum;
107         }
108         //查找9 NINE I
109         if(zidian[(int)'I' - 65] != 0)
110         {
111             tempNum = zidian[(int)'I' - 65];
112             zidian[(int)'I' - 65] = 0;
113             zidian[(int)'N' - 65] -= 2 * tempNum;
114             zidian[(int)'E' - 65] -= tempNum;
115             number[4] = tempNum;
116         }
117         //转化为字符串输出(保证最小)
118         string sum;
119         for (int i = 0; i < 10; i++)
120         {
121             string temps(number[i],(char)(i+48));
122             sum += temps;
123         }
124         cout << sum << endl;
125     }
126     return 0;
127 }
C++ Code

 

 

 

posted @ 2016-10-08 15:23  zdtiio  阅读(901)  评论(0编辑  收藏  举报