- 浏览: 736786 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (439)
- 生活小感 (9)
- Java (65)
- 笔面经 (18)
- 算法 (45)
- 读书笔记 (1)
- Android (147)
- 设计模式 (7)
- C语言 (7)
- 职业生涯 (6)
- 网络 (5)
- 数据库 (3)
- Linux/Unix (21)
- C++ (7)
- 思考 (3)
- WinPhone (4)
- Git (6)
- http (1)
- UML (1)
- SQL (2)
- Ant (1)
- iOS (14)
- FFmpeg (22)
- WebRTC (10)
- Mac (2)
- web (0)
- TCP (2)
- Vim (2)
- OpenSSL (1)
- OpenGL (6)
- 多媒体 (10)
- cocos2d (2)
- svn (1)
最新评论
-
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
WebSocket初探【转】 -
ding335306:
这个目录下没有找到此文件
eclipse.ini in MAC -
songshuaiyang:
哥们写东西可真乱啊
Android获取cpu和内存信息、网址的代码 -
zhoutao_temp:
这是自己能看懂还是让别人能看得懂,您就不能把版面稍微整理一下吗 ...
FFMPEG源码分析 -
chriszeng87:
string2020 写道git clone --bare表示 ...
复制git库
1.一个未排序整数数组,有正负数,重新排列使负数排在正数前面,并且要求不改变原来的 相对顺序 比如: input: 1,7,-5,9,-12,15 ans: -5,-12,1,7,9,15 要求时间复杂度O(N),空间O(1) 。
2.有两堆东西,一堆4个,一堆7个,两个人开始拿东西,一次可以拿任意个,但只能从一堆中拿。现规定:如果最后剩下一个,而且轮到谁拿谁就输了。现在你先拿,请问有致胜方法吗?
3.手机上每个数字对应几个字母,给你一串数字,请你输出所有可能的字符串。要求是最好的算法。好像这个《编程之美》上面有的。有个疑问,这里是不是要注意的一点:如果有相同数字出现,由输出的字母个数可能小于字符串的长度。例如223,可能是BD也可能是AAD。
http://topic.csdn.net/t/20061227/16/5259955.html上有讨论。
方法1:(递归DFS)
本题除去说如何判断什么样的单词是一个有意义的单词这个细节不谈(后文中说要先构造一个字典)。那么问题就转化为如何生成所有可能的字符单词。比如输入123,要生成所有的可能的“单词”:#AD,#AE,#AF,#BD,#BE,#BF,#CD,#CE,#CF。
这是一种全排列的输出方式,如果从解答树上就更易看出来了:
23
/ | \
(A B C)
/ | \ / | \ / | \
(D E F) (DEF) (D E F)
所以最适宜用DFS:
代码:
#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<Windows.h>
using namespace std;
//定义电话号码长度
#define MAX 20
//定义数字对应的字符
char c[10][10]=
{
"@",//0 没有的就用@代替,方便看清楚
"#",//1
"ABC",//2
"DEF",//3
"GHI",//4
"JKL",//5
"MNO",//6
"PQRS",//7
"TUV",//8
"WXYZ"//9
};
//定义按键的可能字符长度
int total[10]=
{
1,1,3,3,3,3,3,4,3,4
};
//电话号码
char number[MAX];
int number_len;
int answer[MAX];//存放位置
void print()
{
for(int i=0;i<number_len;i++)
{
cout<<c[number[i]-'0'][answer[i]];
}
cout<<endl;
}
//level表示循环的层次,号码的位数
//第level个数字
void dfs(int level)
{
//终止情况
if(level==number_len)
{
print();
return ;
}
//该数字是:
int num=number[level]-'0';
for(int i=0;i<total[num];i++)
{
//对应answer位置赋值
answer[level]=i;
dfs(level+1);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
while(cin>>number)
{
number_len=strlen(number);
//第0个数字
dfs(0);
}
::system("pause");
return 0;
}
方法2:(非递归 神奇的双重while循环)
注:显然可以利用这种方法,打印出任意一个N维数组的任意组合。
我的理解:
这段代码虽然很精妙,但是要构造出来有点困难,并且理解起来也不好理解,有这个时间的话,还不如直接dfs,因为实际在程序的运行都是一样的,没有必要用巧妙来代替代码的速度,除非这个方案很常用,或者高效。让我想起了外星人写的求PI程序。
核心:
参见书本P217。
代码:
#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
#include<queue>
#include<Windows.h>
using namespace std;
//定义电话号码长度
#define MAX 20
//定义数字对应的字符
char c[10][10]=
{
"@",//0 没有的就用@代替,方便看清楚
"#",//1
"ABC",//2
"DEF",//3
"GHI",//4
"JKL",//5
"MNO",//6
"PQRS",//7
"TUV",//8
"WXYZ"//9
};
//定义按键的可能字符长度
int total[10]=
{
1,1,3,3,3,3,3,4,3,4
};
//电话号码
char number[MAX];
int number_len;
int answer[MAX];//存放位置
int _tmain(int argc, _TCHAR* argv[])
{
while(cin>>number)
{
number_len=strlen(number);
while (true)
{
int k = number_len - 1;
//一次循环一次从第k个键向前移动一位
while (k >= 0)
{
for (int i = 0; i < number_len; i++)
cout << c[number[i]-'0'][answer[i]] << " ";
cout << endl;
if (answer[k] < total[number[k]-'0'] - 1)
{
//第k个键移动
answer[k]++;
break; //这里只要有一个键的一个位置发生一次变化,就退出,打印一次。
}
else
{
//第k个键移动完毕,回到0,开始遍历上一个键。
//此时,继续内部循环。下次循环,处理上一个键。
answer[k] = 0;
k--;
}
}
if (k < 0)
break;
}
}
::system("pause");
return 0;
}
上面的部分转自:http://hi.baidu.com/silverxinger/blog/item/9321dd7aa9d2c4290cd7dafe.html
评论
发表评论
-
leetcode之 median of two sorted arrays
2015-07-30 00:08 777另一种方法即是利用类似merge的操作找到中位数,利用两个分 ... -
LeetCode – Min Stack
2015-06-11 18:27 635转自:http://www.programcreek.com ... -
二叉树中所有节点的左右子树相互交换 递归与非递归程序
2015-06-11 14:18 3108//将二叉树中所有节点的左右子树相互交换 转自:http: ... -
Word Break II
2015-06-09 23:38 671转自:http://www.acmerblog.com/ ... -
最大子序列和问题
2015-06-08 09:10 741问题描述: 输入一组整数,求出这组数字子序列和 ... -
判断是否二叉搜索树
2015-05-31 16:49 894转自:http://blog.163.com/yichan ... -
LeetCode | Decode Ways
2015-05-28 22:09 654题目: A message containing le ... -
A* Pathfinding for Beginners
2014-11-01 10:40 681转自:http://www.policyalmanac.o ... -
P问题、NP问题和NP完全问题
2014-10-28 23:47 23101、P问题 P是一个判定 ... -
外部排序技术之多路归并
2014-10-19 11:32 967转自:http://blog.chinaunix.net/u ... -
Steve Yegge:Google面试秘籍
2014-09-15 00:21 1266转自:http://blog.jobbole.com/396 ... -
利用动态规划求连续数组最大和以及最大子矩阵的和
2014-09-11 09:14 1996题目一: 给定一个整型数组,数组中有正有负,求最大连续子序 ... -
一些算法刷题的网站
2014-09-04 22:31 38581. leetcode http://leetcode ... -
[leetcode] A Distance Maximizing Problem的疑问
2014-08-25 22:38 1506http://leetcode.com/2011/05/a- ... -
二叉树中两个结点的最近公共祖先
2014-08-03 11:30 548Node* findComAncestor(No ... -
单链表原地逆置递归与非递归解法
2014-07-24 23:48 1165#include <stdio.h> t ... -
Google面试题:赛马问题
2013-07-10 23:52 2137转自: http://coolshell.c ... -
《单链表的环的入口点一个小证明》
2013-06-16 23:14 1427http://blog.csdn.net/learniti ... -
[转]稳定排序和不稳定排序
2013-04-21 12:11 908首先,排序算法的稳定 ... -
JVM知识点题目
2012-01-04 22:11 900JVM是Java程序的运行环境,因此对于JVM的掌握有助于理解 ...
相关推荐
EMC(Electromagnetic Compatibility,电磁兼容)是电子设备或系统在共同的电磁环境中能正常工作且互不干扰的能力。...在面试中,了解并能详细解释这些知识点,无疑会展示出你对EMC领域的深刻理解和专业素养。
EMC笔试题和面试题 本文主要讲述了作者参加EMC公司笔试和面试的经历,分享了笔试和面试的题目、过程和心得体会。 笔试部分主要包括选择题、编程题和写作题三个部分。选择题有30多道,答对得分,答错需要倒扣分数,...
电磁兼容面试笔试试题 面经 针对互联网大厂硬件就业必备 EMC面试笔试必备 硬件电磁兼容 电源电磁敏感 电路设计
EMC面试题.txt emc题库 绿色是答案.doc EMC风险评估.ppt EMC(合同能源管理)市场化节能机制研究.doc EMI EMC设计秘籍.doc EMI & ESD 初解.ppt EMI 3410-VM UV胶资料.pdf EMI Filter设计技术.pdf EMI 测试基本 知识...
硬件工程师面试题集(含答案)pdf,硬件工程师面试题集(含答案)