google面试的一个简单的白板编程题。

之前在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;

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ah_yl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值