之前在CSDN的推文上看到了一篇关于google面试的面试题。题目考察的是白板编程。
给出的编程要求是:
/*['Tokyo','London','Rome','Donlon','Kyoto','Paris']*/
/*
['Tokyo','Kyoto']
['London','Donlon']
['Rome']
['Paris']
*/
/*一个城市名经过旋转后整个是另一个城市名,将所有匹配的城市名放在同一组*/
类似于以上的要求。我整理了一下,自己编写了实现以上功能的代码。并且分享一下,希望各位不要见笑。
代码其中包含4个函数,前三个都比较简单;最后一个生成所需格式然后输出,这个函数比较麻烦,想了一些时间。
以下代码的运行环境为vs2012及以上版本
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
/*['Tokyo','London','Rome','Donlon','Kyoto','Paris']*/
/*
['Tokyo','Kyoto']
['London','Donlon']
['Rome']
['Paris']
*/
/*一个城市名经过旋转后整个是令一个城市名,将所有匹配的城市名放在同一组*/
int countLen(string a);//计算城市名字符串的长度
void __switch(string &a);//将城市名第一个字母转换为小写字母
bool circle_word(string a, string b);//判定两个城市名是否经过旋转后相等
void judge(string *a, int i);//最终生成题目中要求的输出格式。
int main()
{
string a[6] = { "Tokyo","London","Rome","Donlon","Kyoto","Paris" };
judge(a, 6);
return 0;
}
int countLen(string a)
{
int i = 0;
while (1)
{
if (a[i] == '\0')
break;
i++;
}
return i;
}
void __switch(string &a)
{
a[0] += 32;
}
bool circle_word(string a, string b)
{
bool jd = false;
__switch(a);
__switch(b);
if (countLen(a) != countLen(b)) //如果两个城市名,长度不一样,直接返回false
{
return jd;
}
else
{
int len = countLen(a);
for (int i = 0; i < len; ++i)
{
char tmp = a[0];
for (int j = 0; j < len - 1; ++j) //将a字符出旋转一次
{
a[j] = a[j + 1];
}
a[len - 1] = tmp; //----旋转结束
if (a == b)
{
jd = true;
break;
}
}
}
return jd;
}
void judge(string *a, int len)
{
int setlen[100] = { 0 };//设置一个数组,用于存放输出的每一行有几个城市名
string b[100][100]; //多维字符串数组,存放城市名
int i(0), j(0), tmp(0);
b[i][j] = a[0];
bool flag;
for (tmp = 1; tmp < len; ++tmp) //对于输入的a字符串数组,循环包含元素的个数的次数;
{
for (int k2 = 0; k2 <= i; ++k2) //i 为多维字符串数组的行;每一个新的城市名都
//需要与每一行的第一个元素比较
{
flag = circle_word(a[tmp], b[k2][0]);
if (flag == true) //如果比较相同,则城市名加入该行的第setlen[k2]位置;
{
setlen[k2]++;
b[k2][setlen[k2]] = a[tmp];
break;
}
}
if (flag == false) //如果比较结果不相同,则该城市名新建一行,并放在第一个位置
{
i++;
b[i][0] = a[tmp];
setlen[i]++;
}
}
for (int p = 0; p <= i; p++)//打印输出
{
for (int p2 = 0; p2 <= setlen[p]; p2++)
{
cout << b[p][p2] << " ";
}
cout << endl;
}
}