博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
USACO习题:Name That Number
阅读量:6714 次
发布时间:2019-06-25

本文共 981 字,大约阅读时间需要 3 分钟。

这道题或许是这个SEC里最有难度的题目了。题目有些误导,让你用数字先生成所有可能的字母,然后再去字典里找。

这种做法的复杂度随着数字的长度n的上升而上升,为O(3^n)是非常可怕的,而且生成不同长度的字母,需要根据数字长度决定循环的数量,

这里就会用到递归,使得代码变得异常复杂。

 

静下来仔细想想,每组数字可以对应多个单词,同样的,每个单词回应一个数字。换句话说,我们可以轻松得为字典中每个单词先生成一遍

数字,然后根据数字去反查单词。这样代码的速度就非常快了,而且一旦生成好对应,以后任何数字的匹配时间基本等于一次哈希的时间即O(1)。

 

注:在单词转数字的时候,使用一些数学的小技巧可以有效地节省不少代码(对于我这种懒人来说非常合适)。

View Code
#include 
#include
#include
#include
using namespace std; string name2number(string name){
char c=0; int value=0; ostringstream buf; for(string::iterator iter=name.begin();iter!=name.end();iter++){
c=*iter; if(c>'Q'){
value = (c-1-'A')/3 + 2; }else{
value = (c-'A')/3 + 2; } buf<
>value; //cout<
<
>name){ string number = name2number(name); //cout<<"name:"<
<<"-->"<
<

转载于:https://www.cnblogs.com/lzyzizi/archive/2012/03/26/2417565.html

你可能感兴趣的文章
为什么java web项目中要使用spring
查看>>
初赛小知识之存储器
查看>>
Chosen三级联动
查看>>
node安装和npm全局配置
查看>>
python新式类与旧式类
查看>>
js 事件模型
查看>>
Ubuntu 16.04 不能用inittab 设置 运行等级 runlevel
查看>>
asp.net源码坊2015-3月第二周TOP10下载排行
查看>>
看啦这么就别人的博客 我也来写一篇! Object转换其他类型
查看>>
UICollectionView官方使用示例代码研究
查看>>
Set接口
查看>>
java类库 collection与collections (转)
查看>>
关于在微信支付接口和支付宝接口中使用到的辅助函数
查看>>
学习网页编程(一)
查看>>
Windows Server 2008 安装好之后的简单配置
查看>>
MyCat原理及分布式分库分表
查看>>
redis基础_redis介绍
查看>>
WPF中。。DataGrid 实现时间控件和下拉框控件
查看>>
几种常用排序
查看>>
oracle win7下 卸载
查看>>