Created
April 14, 2012 02:02
-
-
Save topin27/2381497 to your computer and use it in GitHub Desktop.
华为的三道上机题
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ======================= | |
// 华为的三道上机题, | |
// 第一题是求出一个数组中的最小数; | |
// 第二题是检验密码字符串,要求长度在8~128之间,并且同时有 | |
// 大写字符、小写字符、数字,同时没有空格。 | |
// 第三题是斗地主规则,A用1表示、K用13表示等等。 | |
// 要求根据相应的牌型返回相应的代码号(其中3代1不考虑, | |
// 只有3个相同的情况)。 | |
// ======================= | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
int getSpecialNum(int n, int num[]) { | |
int min = num[0], secMin = num[n - 1];//初值!! | |
for(int i = 1; i < n - 1; ++i) {//起始序号!! | |
if(num[i] < min) { | |
secMin = min; | |
min = num[i]; | |
} | |
else if(num[i] < secMin) { | |
secMin = num[i]; | |
} | |
else | |
continue; | |
} | |
return secMin; | |
} | |
int checkPassword(char* strPass) { | |
int len = strlen(strPass); | |
if(len < 8 || len > 128) | |
return 1; | |
int tmp = 0;//保存每个字符的ascii码。 | |
bool numOK = false; | |
bool uppperCaseOK = false; | |
bool lowerCaseOK = false; | |
for(int i = 0; i < len; ++i) { | |
tmp = int(strPass[i]); | |
if(tmp > 47 && tmp < 58) { | |
numOK = true; | |
} | |
if(tmp > 96 && tmp < 123) { | |
lowerCaseOK = true; | |
} | |
if(tmp > 64 && tmp < 91) { | |
uppperCaseOK = true; | |
} | |
if(tmp == 32) | |
return 3; | |
} | |
if(numOK && lowerCaseOK && uppperCaseOK == false) | |
return 2; | |
return 0; | |
} | |
int checkPokerRule(int num, int poker[]) { | |
if(num == 1) return 1; | |
if(num == 2 && poker[0] == poker[1]) return 2; | |
if(num == 3 && poker[0] == poker[1] && poker[1] == poker[2]) return 3; | |
if(num == 4 && poker[0] == poker[1] && poker[1] == poker[2] && poker[2] == poker[3]) return 4; | |
if(num > 4) {//只能是姐妹对或者顺子的情况。 | |
bool thirteen = false;//判断牌中是否有K。 | |
for(int i = 0; i < num; ++i) | |
if(poker[i] == 13) thirteen = true; | |
if(thirteen) {//出的牌中有K,将A变成14。 | |
for(int i = 0; i < num; ++i) { | |
if(poker[i] == 1) | |
poker[i] = 14; | |
} | |
} | |
//使用冒泡排序将poker数组再次排序。 | |
for(int j = num; j > 0; --j) | |
for(int i = 0; i < j - 1; ++i) { | |
if(poker[i]>poker[i+1]) { | |
poker[i] = poker[i] + poker[i + 1]; | |
poker[i + 1] = poker[i] - poker[i + 1]; | |
poker[i] = poker[i] - poker[i + 1]; | |
} | |
} | |
//================================ | |
//判断是姐妹对还是顺子。 | |
bool itsOK = true;//flag | |
if(poker[0] == poker[1]) {//出姐妹对 | |
for(int i = 1; i < num; ++i) { | |
if(i % 2 == 1) {//姐妹对的牌,奇数位置的牌应该和前面一位相同 | |
if(poker[i] == poker[i - 1]) | |
itsOK = itsOK && true; | |
else | |
itsOK = itsOK && false; | |
} | |
else {//偶数位置的牌应该比前一位大1 | |
if(poker[i] == (poker[i - 1] + 1)) | |
itsOK = itsOK && true; | |
else | |
itsOK = itsOK && false; | |
} | |
} | |
if(itsOK) | |
return 6; | |
}//姐妹对判断结束。 | |
else {//出的是顺子 | |
for(int i = 1; i < num; ++i) {//顺子的情况是后一位比前一位大1 | |
if(poker[i] == (poker[i - 1] + 1)) | |
itsOK = itsOK && true; | |
else | |
itsOK = itsOK && false; | |
} | |
if(itsOK) | |
return 5; | |
}//顺子的情况判断结束。 | |
}//num>4的情况结束。 | |
return 0; | |
} | |
int main() | |
{ | |
/* | |
//第一题测试 | |
int num[] = {4, 5, 7, 6, 8, 4, 2, 5, 2}; | |
printf("%d\n", getSpecialNum(sizeof(num) / sizeof(int), num)); | |
//========== | |
*/ | |
/* | |
//第二题测试 | |
char strPass[] = "4adh27817"; | |
printf("%d\n", checkPassword(strPass)); | |
//========== | |
*/ | |
/* | |
//第三题测试 | |
int poker[] = {10, 10, 13, 13, 1, 12, 1, 12, 11, 11}; | |
printf("%d\n", checkPokerRule(sizeof(poker) / sizeof(int), poker)); | |
//========== | |
*/ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment