百度2013校园招聘笔试题

本文介绍了一种基于电话号码查找对应用户名的算法实现。通过非递归和递归两种方法,该算法可以有效地从电话簿中搜索到所有可能的匹配项,并展示了具体的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三:系统设计题(30)
 

现在有一个手机,手机上的键盘上有这样的对应关系,2对应"abc",3对应"def".....手机里面有一个userlist用户列表,当我们输入942的时候出来拼音的对应可能是“xia”,“zha”,“xi”,“yi”等,当我们输入9264的时候出来是yang,可能是“样”,“杨”,“往”等,现在我们输入一个字符串数字,比如926等,要在电话簿userlist中查找出对应的用户名和电话号码并返回结果。

#include <iostream>
#include <cstdlib>
#define N 4 //电话号码个数

using namespace std;

char c[][10] = {"","","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"};//存储各个数字所能代表的字符
int number[N] = {2, 4 ,7, 9}; //存储电话号码
int total[10] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4}; //各个数组所能代表的字符总数
int answer[N]; //数字目前所代表的字符在其所能代表的字符集中的位置,初始为0

void Search(int *number, int n); //非递归的办法
void RecursiveSearch(int *number, int cur, char *ps, int n); //递归的办法
int main()
{
        //Search(number, N);
        char ps[N+1] = {0};
        RecursiveSearch(number, 0, ps, N);
        return 0;
}
/**
*递归的解法: number为存储电话号码的数组,pos为当前处理的数字在number中的下标,初始为0
*ps为一外部数组,用于存放字母,n代表电话号码的长度(个数)
* 此递归的方法好理解,比上面非递归的办法好写易懂
* */
void RecursiveSearch(int *number, int pos, char *ps, int n)
{
        int i;
        for(i=0; i<total[number[pos]]; ++i)
        {
                ps[pos] = c[number[pos]][i];
                if(pos == n-1)
                        cout<<ps<<endl;
                else
                        RecursiveSearch(number, pos+1, ps, n);
        }
}
//C++语言: 电话号码对应的英语单词(注意此题的非递归做法) 
void Search(int *number, int n)
{
        int i;
        while(1)
        {
                for(i=0; i<n; ++i)
                        printf("%c", c[number[i]][answer[i]]);
                printf("\n");
                int k = n-1;    //用k和while循环来解决扩展性问题,模拟了递归
                while(k >= 0)
                {
                        if(answer[k] < total[number[k]]-1)
                        {
                                ++answer[k];
                                break;
                        }
                        else
                        {
                                answer[k] = 0;
                                --k;
                        }
                }
                if(k < 0)
                        break;
        }
}




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值