C++ 算法(面试题)
/*
面试题(视若飞),在规定的时间没做出来,回家以后自己做了:
假设扑克牌从小到大顺序是 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A任意输入5张牌,排序方式有如下三种情况:
第一种:输入不同的5张牌,输出从大到小的顺序排列的结果。
输入:5, 3, J, 10, A
输出:A, J, 10, 5, 3
第二种:输入有相同的一对,首先输出对,没成对的再从大到小排序。
输入:5, 2, 10, A, 2
输出:2, 2, A, 10, 5
第三种:输入有两对,首先输出大对,然后输出小对,然后输出没有成对的。
输入:2, 10, A, 2, A
输出:A, A, 2, 2, 10
*/
include "stdafx.h"
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <cstring>
using namespace std;
void print(int* iCards,int cnt)
{
for (int i = 0;i < cnt; i++) {
if (iCards[i] == 11)
{
cout << 'J' << ',';
}
else if (iCards[i] == 12)
{
cout << 'Q' << ',';
}
else if (iCards[i] == 13)
{
cout << 'K' << ',';
}
else if (iCards[i] == 14)
{
cout << 'A' << ',';
}
else {
cout << iCards[i] << ',';
}
}
cout << endl;
}
void sort(int* iCard, int cnt)
{
int* pTemp = new int[cnt];
memcpy(pTemp, iCard, sizeof(int)*cnt);
for (int i = 0;i < cnt-1;i++)
{
int maxIndex = i;
//找到i及的最大值,与第i个元素比较
for (int j = i + 1;j < cnt;j++) {
if (pTemp[j] > pTemp[maxIndex])
{
maxIndex = j;
}
}
if (maxIndex != i) {
int temp = pTemp[i];
pTemp[i] = pTemp[maxIndex];
pTemp[maxIndex] = temp;
}
}
// 成对数的copy到iCards
int count = 0;
for (int i = 0;i < cnt - 1;i++)
{
if (pTemp[i] == pTemp[i + 1]) {
iCard[count++] = pTemp[i];
iCard[count++] = pTemp[i + 1];
pTemp[i] = -1;
pTemp[i + 1] = -1;
}
}
// 不成对的copy到iCards;
for (int i = 0;i < cnt;i++) {
if (pTemp[i] != -1)
{
iCard[count++] = pTemp[i];
}
}
}
/*
入参: line 输入的字符串
num 出参数组的大小
出参: iCards 转换成数值的数组首地址
返回值: -1标识输入错误,否则返回正常的切分后字符串个数
*/
int decompose(const string& line,int* iCards, int num)
{
int cnt = 0;
char split = ',';
char cards[16] = { '\0' };
string strCards[5];
strncpy(cards, line.c_str(), line.length());
cards[line.length()] = '\0';
// 准备切割字符串
for (int i = 0;i < line.length();i++)
{
if (cards[i] == split) {
cards[i] = ' ';
cnt++;
}
}
cnt++;//比',' 多一个
if (cnt > num) {
cout << "the cards number wrong!" << endl;
return -1;
}
istringstream instr(cards);
memset(cards, 0, sizeof(char) * 16);
memset(iCards, 0, sizeof(int) * 5);
for (int i = 0;i < cnt;i++)
{
instr >> strCards[i];
if (strCards[i] == "J")
{
iCards[i] = 11;
}
else if (strCards[i] == "Q")
{
iCards[i] = 12;
}
else if (strCards[i] == "K")
{
iCards[i] = 13;
}
else if (strCards[i] == "A")
{
iCards[i] = 14;
}
else
{
iCards[i] = atoi(strCards[i].c_str());
if (iCards[i] < 2 || iCards[i]>10)
{
cout << "you input error!" << endl;
return -1;
}
}
}
return cnt;
}
int main()
{
string line;
int iCards[5];
cout << "input cards:";
while (getline(cin, line))
{
int cnt = decompose(line, iCards, 5);
if (-1 == cnt)
{
cout << "input cards:";
continue;
}
sort(iCards,cnt);
print(iCards, cnt);
cout << "input cards:";
}
return 0;
}