小米2017校园招聘笔试第一题

danieldan007 2016-09-24 08:53:06
题目大概说小米有个数字加密算法,先把数字+8取个位,然后把那些数字都换成大写的单词,比如1变成ONE,0变成ZERO,最后再将这些字母随机打乱,就变成了加密后的数字。现在要求给出加密的数字字符串,让你解析出原来的数字,从小到大排列~
费了好久写完了,结果花线不对,只能保证第一组数据对,后面不知是什么原因就感觉是越界或者怎样,好像是非法了,谁能给看看代码,谢谢啦,让我死个明白~呜呜
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void bubbleSort(int *arr, int len)
{
int i, j, flag=0, t;
for(i = 0; i < len; ++i)
{
for(j = 0; j < len-1; ++j)
{
if(arr[j] > arr[j+1])
{
t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
flag = 1;
}
}
if(flag == 0)
break;
flag = 0;
}

}
int main()
{
int row_num, i, j, a[26]={0}, nums[1000], len, count;
char arr[10000];
scanf("%d", &row_num);
count = row_num;
while(count--)
{
scanf("%s", arr);
//将所有的字母都按照他们在字母表中的位置放在数组里面
for(i = 0; i < strlen(arr); ++i)
{
a[(int)(arr[i]-'A')]++;
}
i = 0;
//以下对每个数字独特的字母进行处理
//只有0里面有Z,所以有几个Z就有几个0
if(a[25])
while(a[25]--)
{
nums[i++] = 2;
a[4]--;
a[17]--;
a[14]--;
}
//只有2有W
if(a[22])
while(a[22]--)
{
nums[i++] = 4;
a[19]--;
a[14]--;
}
//只有4有U
if(a[20])
while(a[20]--)
{
nums[i++] = 6;
a[5]--;
a[14]--;
a[17]--;
}
//只有6有X
if(a[23])
while(a[23]--)
{
nums[i++] = 8;
a[18]--;
a[8]--;
}
//只有8有G
if(a[6])
while(a[6]--)
{
nums[i++] = 0;
a[4]--;
a[8]--;
a[7]--;
a[19]--;
}
//在之前处理完成后,剩下的里面只有1有O
if(a[14])
while(a[14]--)
{
nums[i++] = 3;
a[13]--;
a[4]--;
}
//3
if(a[19])
while(a[19]--)
{
nums[i++] = 5;
a[7]--;
a[17]--;
a[4] -= 2;
}
//5
if(a[5])
while(a[5]--)
{
nums[i++] = 7;
a[8]--;
a[21]--;
a[4]--;
}
//7
if(a[18])
while(a[18]--)
{
nums[i++] = 9;
a[4] -= 2;
a[21]--;
a[13]--;
}
//9
if(a[13])
while(a[8]--)
{
nums[i++] = 1;
a[13] -= 2;
a[4]--;
}
len = i;
bubbleSort(nums, len);
for(j = 0; j < len; ++j)
printf("%d", nums[j]);
printf("\n");
memset(nums, 0, len);
memset(a, 0, 26);
for(j = 0; j < len; ++j)
printf("%d", nums[j]);
memset(arr, '\0', strlen(arr));
}
return 0;
}
...全文
1457 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
漂浮一生 2016-09-30
  • 打赏
  • 举报
回复
引用 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取个位, 就是原来的数, 从小到大排序即可
这个思路是对的
iamyuqy 2016-09-30
  • 打赏
  • 举报
回复
公司外网虚拟机写不了代码,说下基本的思路不,大家可以指正下。因为字符串的顺序是打乱的,所以其实这个问题的本质就是一个解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. 根据每一个数字的个数,得出相应的结果即可;
runningDay 2016-09-30
  • 打赏
  • 举报
回复
("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取个位, 就是原来的数, 从小到大排序即可
danieldan007 2016-09-27
  • 打赏
  • 举报
回复
引用 3 楼 zycxnanwang 的回复:
单纯得想问一下题目链接……
看楼下雷锋啦~
danieldan007 2016-09-27
  • 打赏
  • 举报
回复
引用 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取个位加密的,所以有类似偏移的地方。另外下面那个输出是我调试用的,我看看是否都清零了~
danieldan007 2016-09-27
  • 打赏
  • 举报
回复
引用 1 楼 u012849694 的回复:
你好,我今年也参加了小米公司的笔试,我也做了这个题目,我是第三题,当时调试了半天也没成功。请问您的笔试结果出来了吗?我今天查了半天没有查到笔试成绩的地址。
小米这个还能查笔试成绩吗?反正我做校招在线答题从来没听过有能查笔试成绩的呀,如果过了就会给你发短信让你去面试啦,我同学有今天上午去的,不造你咋样啦~
pkuzhx 2016-09-26
  • 打赏
  • 举报
回复
以下代码不保证没有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;
}
pkuzhx 2016-09-26
  • 打赏
  • 举报
回复
nums[i++] = 2; 这是什么意思? 而且题目说范围是10000,你数组取做10001,这不是常识吗?虽然10000也不影响你做题,但是总觉得你代码习惯非常不严谨,大思路是对的,小思路混乱,看不懂
pkuzhx 2016-09-26
  • 打赏
  • 举报
回复
这代码没救了……连题目给出的四个数据都过不了
always_loop 2016-09-26
  • 打赏
  • 举报
回复
活雷锋来了~我来甩原题链接~ http://wenku.baidu.com/link?url=4NYfyGHC3RpzJhuI4ipsfNzDwvK_OZFjDCXQXoxCzAvpU_6PirwVRUKMxG2Q7Et5IKayi5pgMQxDm4vthg7j09KVGkDMeWzNN1lvSAVRDvW 我也是弄好半天调试不出来 最后才看到三四行 字母其实被打乱了==== 死的不明不白 还想接着把它弄出来 不知道楼主要不要一起讨论看看==
fefe82 2016-09-25
  • 打赏
  • 举报
回复
写几个片段吧 ...

//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));
小培要转运 2016-09-25
  • 打赏
  • 举报
回复
你好,我今年也参加了小米公司的笔试,我也做了这个题目,我是第三题,当时调试了半天也没成功。请问您的笔试结果出来了吗?我今天查了半天没有查到笔试成绩的地址。
zycxnanwang 2016-09-25
  • 打赏
  • 举报
回复
单纯得想问一下题目链接……

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧