【每天一道算法题】Numeric Keypad
题目描述
The numberic keypad on your mobile phone looks like below:
123
456
789
0
suppose you are holding your mobile phone with single hand. Your thumb
points at digit 1. Each time you can 1)press the digit your thumb
pointing at.2)moveyour thumb right,3)move your thumb down. Moving your
thumb left or up is not allowed.
By using the numeric keypad under above constrains, you can produce
some numbers like 177 or 480 while producing other numbers like 590 or
52 is impossible.
Given a number K, find out the maximum number less than or equal to K
that can be produced.
输入描述:
the first line contains an integer T, the number of testcases.
Each testcase occupies a single line with an integer K. For 50%of the data ,1<=K<=999.
For 100% of the data, 1<=K<=10^500,t<=20.
输出描述:
for each testcase output one line, the maximum number less than or equal to the corresponding K that can be produced.
输入例子:
3
25
83
131
输出例子:
25
80
129
剑指offer公司真题部分,微软的题目。

#include <iostream>
#include <vector>
#include <string>
#include <queue>
using namespace std;
int pad[][] = {
{ },
{ ,,,,,,,,, },
{ ,,,,,, },
{ ,, },
{ ,,,,,, },
{ ,,,, },
{ , },
{ ,,, },
{ ,, },
{ } };
int last[] = { ,,,,,,,,, }; string maxnum(string& s1) {
string s2;
s2.push_back(s1[]);
int len = s1.length();
for (int i = ; i < len; ) {
int need = s1[i] - '';
int key = s2.back() - '';
int j = ;
for (j = last[key]; j >= ; j--)
{
if (pad[key][j] == need) {
i++;
s2.push_back(pad[key][j] + '');
break;
}
} if (j < ) {
for (j = last[key]; j >= ; j--)
{
if (pad[key][j] < need) {
s2.push_back(pad[key][j] + '');
key = s2.back() - '';
for (int j = s2.size(); j < len; j++)
s2.push_back(pad[key][last[key]] + '');
return s2;
}
}
} if (j < ) {
need = key;
s2.pop_back();
if (s2.size() == ) {
s2.push_back(need - + '');
key = s2.back() - '';
for (int j = s2.size(); j < len; j++)
s2.push_back(pad[key][last[key]] + '');
return s2;
} key = s2.back()-'';
for (j = last[key]; j >= ; j--)
{
if (pad[key][j] < need) {
s2.push_back(pad[key][j] + '');
key = s2.back() - '';
for (int j = s2.size(); j < len; j++)
s2.push_back(pad[key][last[key]]+'');
return s2;
}
}
} }
return s2;
} int main() {
int num;
cin >> num;
vector<string> vec(num,"");
for (int i = ; i < num; i++)
cin >> vec[i];
for (int i = ; i < num; i++)
cout << maxnum(vec[i]) << endl;
return ;
}
【每天一道算法题】Numeric Keypad的更多相关文章
- 每天一道算法题(4)——O(1)时间内删除链表节点
1.思路 假设链表......---A--B--C--D....,要删除B.一般的做法是遍历链表并记录前驱节点,修改指针,时间为O(n).删除节点的实质为更改后驱指针指向.这里,复制C的内容至B(此时 ...
- 从一道算法题实现一个文本diff小工具
众所周知,很多社区都是有内容审核机制的,除了第一次发布,后续的修改也需要审核,最粗暴的方式当然是从头再看一遍,但是编辑肯定想弄死你,显然这样效率比较低,比如就改了一个错别字,再看几遍可能也看不出来,所 ...
- 【每天一道算法题】时间复杂度为O(n)的排序
有1,2,……一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度为O(1),使用交换,而且一次只能交换两个数. 这个是以前看到的算法题,题目不难.但是要求比较多,排序算法中,时间 ...
- 提前批笔试一道算法题的Java实现
题目描述 这是2021广联达校招提前批笔试算法题之一. 我们希望一个序列中的元素是各不相同的,但是理想和显示往往是有差距的.现在给出一个序列A,其中难免有相同的元素,现在提供了一种变化方式,使得经过若 ...
- 每天一道算法题-leetcode136-只出现一次的数字
前言 打卡第一天 2019.10.26日打卡 算法,即解决问题的方法.同一个问题,使用不同的算法,虽然得到的结果相同,但是耗费的时间和资源是不同的.这就需要我们学习算法,找出哪个算法更好. 大家都知道 ...
- 一道算法题加深我对C++中map函数的理解
一.一道题目引发我对map函数的考量 首先是题目大意:有n个银行,a[i]表示这个人在第i个银行有a[i]块钱(可以是负数),所有银行的钱加起来正好是0.每次只能在相邻的银行之间转账,问最少要转多少次 ...
- 每天一道算法题(14)——N个降序数组,找到最大的K个数
题目: 假定有20个有序数组,每个数组有500个数字,降序排列,数字类型32位uint数值,现在需要取出这10000个数字中最大的500个. 思路 (1).建立大顶堆,维度为数组的个数,这里为20( ...
- 认真对待每一道算法题 之 两个排序好的数组寻找的第k个大的数
转载博客:http://www.cnblogs.com/buptLizer/archive/2012/03/31/2427579.html 题目意思:给出两个排好序的数组 ,不妨设为a,b都按升序排列 ...
- 《github一天一道算法题》:分治法求数组最大连续子序列和
看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...
随机推荐
- kaptcha 验证码组件使用
kaptcha 验证码组件使用简介 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.co ...
- [图形学] 习题8.6 线段旋转后使用Cohen-Sutherland算法裁剪
习题8.6 生成一条比观察窗口对角线还长的线段动画,线段重点位于观察窗口中心,每一帧的线段在上一帧基础上顺时针旋转一点,旋转后用Cohen-Sutherland线段裁剪算法进行裁剪. 步骤: 1 视口 ...
- NewsDaoImpl
package com.pb.news.dao.impl; import java.sql.CallableStatement;import java.sql.Connection;import ja ...
- 关于Win7 内存变小处理方法
windows + R 输入msconfig 点击引导 点击高级选项 点击最大内存打钩,就好了,你重启,你的内存将恢复成原来的.
- if else 与switch case判断
基础数据类型(四类八种 ) 不能为null. 整数型 byte 取值范围2的8次方 short 取值范围2的16次方 int 取值范围2的32次方 一般用int long 取值范围2的64次方 浮点型 ...
- Eclipse安装反编译工具JadClipse for Eclipse手把手教程
今天闲来无事准备弄弄eclipse的反编译工具JadClipse for Eclipse,百度经验里也说的比较清楚只是两个文件下载地址没有明确 net.sf.jadclipse_3.3.0.jar ...
- Xamarin Android绑定微信SDK
现在几乎所有的APP都集成了向微博,微信等社交平台分享的功能.这些社交平台官方也提供了SDK让开发者使用,对于Android和IOS平台而言,只需要下载官方的SDK,按照官方说明文档进行集成就可以轻松 ...
- mongodb3 ubuntu离线安装(非apt-get)及用户管理
目前mongodb已经出到3.x,相对于2.x改动较大,本着学新不学旧的原则来捣鼓nosql数据库.最初想着apt-get安装但是软件源上都是2.x的,遂下载好后传到服务器安装. 1.下载 不得不说国 ...
- 有关java 8
http://www.iteye.com/news/27608 Java 8 发布时间敲定,延期半年 http://www.iteye.com/news/24631/ Java 8 的重要 ...
- win7下从ruby源代码编译安装
工作中需要在c++代码中嵌入ruby c api,然而在vs工程中编译失败,所以现在通过手动从源代码编译ruby寻找原因(之前使用rubyinstaller安装). 先从官网下载ruby 2.4. ...