user-0 提问: 小米2017校园招聘笔试第一题

回复:
user: user-1
content: 引用 11 楼 u010963658 的回复:（"ZERO", "ONE", "TWO", "THREE", "FOUR",  "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"） 如果有Z, 一定是ZERO(0) 如果有W, 一定是TWO(2) 如果有U, 一定是FOUR(4) 如果有X, 一定是SIX(6) 如果有G, 一定是EIGHT(8) 根据这些关键字, 先去掉可以肯定有的数字, 剩下的就是 ONE, THERE, FIVE, SEVEN, NINE, 因为前面的ZERO已经将自己的O给移除了, 所以如果剩下的字符里面还有O, 那一定是ONE, 同理, 移除掉ONE后, 如果还有H, 就是THERE 移除掉THERE后, 如果还有F, 就是FIVE 移除掉FIVE后, 如果还有S, 就是SEVEN 移除掉SEVEN, 就剩下NINE了 然后将数据+2取个位, 就是原来的数, 从小到大排序即可这个思路是对的

user: user-2
content: 公司外网虚拟机写不了代码，说下基本的思路不，大家可以指正下。因为字符串的顺序是打乱的，所以其实这个问题的本质就是一个解10元方程的问题，将原始的字符串按照从字母‘A’到‘Z’统计出来个数，在假设从0到9的个数搞一个方程的解就OK了。步骤如下：  1. 题目中说最多只有1000个字符的数组，因此需要创建一个1001个元素的数组来接纳这些值； 2. 创建一个10个元素的数组auiNumberCnt[10]，其中每一个元素auiNumberCnt[x]代表其中x数字的个数； 3. 创建一个24个元素的数组auiAlphabetCnt[24]，其中auiAlphabetCnt[0]代表字母A的个数，以此类推； 4. 先遍历原有的加密字符数组，分别得到字母‘A’到‘Z’的个数； 5. 剩余的事情就是得到一个方程式的解的过程中，比如数字0的个数就等于字母‘Z’的个数，这是一个10元10次方程组，因此是必然有解的； 6. 根据每一个数字的个数，得出相应的结果即可；

user: user-3
content: （"ZERO", "ONE", "TWO", "THREE", "FOUR",  "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"） 如果有Z, 一定是ZERO(0) 如果有W, 一定是TWO(2) 如果有U, 一定是FOUR(4) 如果有X, 一定是SIX(6) 如果有G, 一定是EIGHT(8) 根据这些关键字, 先去掉可以肯定有的数字, 剩下的就是 ONE, THERE, FIVE, SEVEN, NINE, 因为前面的ZERO已经将自己的O给移除了, 所以如果剩下的字符里面还有O, 那一定是ONE, 同理, 移除掉ONE后, 如果还有H, 就是THERE 移除掉THERE后, 如果还有F, 就是FIVE 移除掉FIVE后, 如果还有S, 就是SEVEN 移除掉SEVEN, 就剩下NINE了 然后将数据+2取个位, 就是原来的数, 从小到大排序即可

user: user-0
content: 引用 3 楼 user-8 的回复:单纯得想问一下题目链接…… 看楼下雷锋啦~

user: user-0
content: 引用 2 楼 fefe82 的回复:写几个片段吧 ...  //0 ~ 9 计数 int numes[10] = {0}; // ....            // 看你的程序，好像到偏移了 2? 0->2, 1->3, 2->4 ...            // 0 ，其它同           nums[2] += a[25];          a[4] -= a[25];          a[17]-=a[25];          a[14]-=a[25];          a[25] = 0;  // 输出 for (int i = 0; i < 10; i ++)     for (int j = 0; j < nums[i]; j++)          putchar('0' + i); putchar('\n');    ==============================              memset(nums, 0, len);             memset(a, 0, 26);             // 这里又输出了一遍是题目要求吗？这次已经清零了，就全是零了啊。             for(j = 0; j < len; ++j)                   printf("%d", nums[j]);                   // 你的 arr 够大吗？                   //memset(arr, '\0', strlen(arr));                   memset(arr, 0, sizeof(arr));  多谢回答，那个题目的要求就是+8取个位加密的，所以有类似偏移的地方。另外下面那个输出是我调试用的，我看看是否都清零了~

user: user-0
content: 引用 1 楼 u012849694 的回复:你好，我今年也参加了小米公司的笔试，我也做了这个题目，我是第三题，当时调试了半天也没成功。请问您的笔试结果出来了吗？我今天查了半天没有查到笔试成绩的地址。 小米这个还能查笔试成绩吗？反正我做校招在线答题从来没听过有能查笔试成绩的呀，如果过了就会给你发短信让你去面试啦，我同学有今天上午去的，不造你咋样啦~

user: user-4
content: 以下代码不保证没有bug，也不保证效率，但最起码测试原题数据是通过的：  #include <stdio.h> #include <string.h> #include <memory.h> int main() { 	char cipher[10001]; 	int T, i, j, len; 	int letters[26], numbers[10], numbers_minus_8[10]; 	scanf("%d", &T); 	while(T--) 	{ 		scanf("%s", cipher); 		memset(letters, 0, 26 * sizeof(int)); 		len = strlen(cipher); 		for (i = 0; i < len; i++) 		{ 			letters[cipher[i] - 'A']++; 		} 		// 0 ZERO: Z 		numbers[0] = letters['Z' - 'A']; 		letters['E' - 'A'] -= letters['Z' - 'A']; 		letters['R' - 'A'] -= letters['Z' - 'A']; 		letters['O' - 'A'] -= letters['Z' - 'A']; 		letters['Z' - 'A'] = 0; 		// 2 TWO: W 		numbers[2] = letters['W' - 'A']; 		letters['T' - 'A'] -= letters['W' - 'A']; 		letters['O' - 'A'] -= letters['W' - 'A']; 		letters['W' - 'A'] = 0; 		// 4 FOUR: U 		numbers[4] = letters['U' - 'A']; 		letters['F' - 'A'] -= letters['U' - 'A']; 		letters['O' - 'A'] -= letters['U' - 'A']; 		letters['R' - 'A'] -= letters['U' - 'A']; 		letters['U' - 'A'] = 0; 		// 6 SIX: X 		numbers[6] = letters['X' - 'A']; 		letters['S' - 'A'] -= letters['X' - 'A']; 		letters['I' - 'A'] -= letters['X' - 'A']; 		letters['X' - 'A'] = 0; 		// 4 FOUR: U 		numbers[8] = letters['G' - 'A']; 		letters['E' - 'A'] -= letters['G' - 'A']; 		letters['I' - 'A'] -= letters['G' - 'A']; 		letters['H' - 'A'] -= letters['G' - 'A']; 		letters['T' - 'A'] -= letters['G' - 'A']; 		letters['G' - 'A'] = 0; 		// second round 		// 1 ONE: O 		numbers[1] = letters['O' - 'A']; 		letters['N' - 'A'] -= letters['O' - 'A']; 		letters['E' - 'A'] -= letters['O' - 'A']; 		letters['O' - 'A'] = 0; 		// 3 THREE: H 		numbers[3] = letters['H' - 'A']; 		letters['T' - 'A'] -= letters['H' - 'A']; 		letters['R' - 'A'] -= letters['H' - 'A']; 		letters['E' - 'A'] -= letters['H' - 'A']; 		letters['E' - 'A'] -= letters['H' - 'A']; 		letters['H' - 'A'] = 0; 		// 5 FIVE: F 		numbers[5] = letters['F' - 'A']; 		letters['I' - 'A'] -= letters['F' - 'A']; 		letters['V' - 'A'] -= letters['F' - 'A']; 		letters['E' - 'A'] -= letters['F' - 'A']; 		letters['F' - 'A'] = 0; 		// 7 SEVEN: S 		numbers[7] = letters['S' - 'A']; 		letters['E' - 'A'] -= letters['S' - 'A']; 		letters['V' - 'A'] -= letters['S' - 'A']; 		letters['E' - 'A'] -= letters['S' - 'A']; 		letters['N' - 'A'] -= letters['S' - 'A']; 		letters['S' - 'A'] = 0; 		// only NINE left 		// 9 NINE: F 		numbers[9] = letters['I' - 'A']; 		// minus 8 		for (i = 0; i <=9; i++) 		{ 			numbers_minus_8[(i + 2) % 10] = numbers[i]; 		} 		// print answer 		for (i = 0; i <=9; i++) 		{ 			if(numbers_minus_8[i]) 			{ 				for (j = 0; j < numbers_minus_8[i]; j++) 				{ 					printf("%d", i); 				} 			} 		} 		printf("\n"); 	} 	return 0; }

user: user-4
content: nums[i++] = 2; 这是什么意思？ 而且题目说范围是10000，你数组取做10001，这不是常识吗？虽然10000也不影响你做题，但是总觉得你代码习惯非常不严谨，大思路是对的，小思路混乱，看不懂

user: user-4
content: 这代码没救了……连题目给出的四个数据都过不了

user: user-5
content: 活雷锋来了~我来甩原题链接~ http://wenku.baidu.com/link?url=4NYfyGHC3RpzJhuI4ipsfNzDwvK_OZFjDCXQXoxCzAvpU_6PirwVRUKMxG2Q7Et5IKayi5pgMQxDm4vthg7j09KVGkDMeWzNN1lvSAVRDvW 我也是弄好半天调试不出来 最后才看到三四行 字母其实被打乱了==== 死的不明不白 还想接着把它弄出来 不知道楼主要不要一起讨论看看==

user: user-6
content: 写几个片段吧 ...  //0 ~ 9 计数 int numes[10] = {0}; // ....            // 看你的程序，好像到偏移了 2? 0->2, 1->3, 2->4 ...            // 0 ，其它同           nums[2] += a[25];          a[4] -= a[25];          a[17]-=a[25];          a[14]-=a[25];          a[25] = 0;  // 输出 for (int i = 0; i < 10; i ++)     for (int j = 0; j < nums[i]; j++)          putchar('0' + i); putchar('\n');    ==============================              memset(nums, 0, len);             memset(a, 0, 26);             // 这里又输出了一遍是题目要求吗？这次已经清零了，就全是零了啊。             for(j = 0; j < len; ++j)                   printf("%d", nums[j]);                   // 你的 arr 够大吗？                   //memset(arr, '\0', strlen(arr));                   memset(arr, 0, sizeof(arr));

user: user-7
content: 你好，我今年也参加了小米公司的笔试，我也做了这个题目，我是第三题，当时调试了半天也没成功。请问您的笔试结果出来了吗？我今天查了半天没有查到笔试成绩的地址。

user: user-8
content: 单纯得想问一下题目链接……