Skip to content

Instantly share code, notes, and snippets.

@topin27
Created April 14, 2012 02:02
Show Gist options
  • Save topin27/2381497 to your computer and use it in GitHub Desktop.
Save topin27/2381497 to your computer and use it in GitHub Desktop.
华为的三道上机题
// =======================
// 华为的三道上机题,
// 第一题是求出一个数组中的最小数;
// 第二题是检验密码字符串,要求长度在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