
编程之美
wyjvip333
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2.1 求二进制数中1的个数
1,给一个打表和暴力折中的方法:打表countTable[256]:存放0到255中1的个数则有:[code="c++"]int IntBitNum(int v){ int ret = 0; while(v) { ret += countTable[v & 0x0f]; v >> 4; } return ret;}[/code]2...原创 2010-09-21 16:57:01 · 115 阅读 · 0 评论 -
3.3 计算字符串的相似度
1,一步增加,删除,或修改一个字符。2,计算总步数,使得两个字符串相等。注:增加一个字符和删除一个字符实质是一样的。问题可以归结为:(1)一步操作后,再将A[2,...]和B[1,...]变成相同字符串。(2)一步操作后,再将A[1,...]和B[2,...]变成相同字符串。(3)一步操作后,再将A[2,...]和B[2,...]变成相同字符串。3,得到一种...原创 2010-09-21 17:20:36 · 97 阅读 · 0 评论 -
3.2电话号码对应英语单词
方法一、神奇的双重while循环。注:显然可以利用这种方法,打印出任意一个N维数组的任意组合。方法二、递归(实质就是DFS)实例代码:[code="c++"]#include#includeusing namespace std;//键盘数字上的字符char c[10][10] = { "", "", "ABC", "DEF", ...原创 2010-09-21 17:19:13 · 171 阅读 · 0 评论 -
3.1 字符串移位包含的问题:
1,题意:给定s1和s2,判定s2是否能够被s1做循环移位得到的字符串包含。2,解决:方法一:[code="c++"]#include#includeusing namespace std;bool isMatch(char* src, char* des){ int len = strlen(src); for (int i = 0; ...原创 2010-09-21 17:17:12 · 140 阅读 · 0 评论 -
2.10 寻找数组中的最大值和最小值
1,可以将者看成两个独立的问题。个需要比较N次,需要比较2*N次。2,我们可以两两分组。每一对中较小的放左边,较大放右边。 N/2次。奇数位比较N/2次,找到最小值。偶数位比较N/2次,找到最大值。总的比较次数:1.5N。缺点:破坏了原数组。3,维持两个变量min和max。取出两个数,相比较1次。较小的和min比较,决定是否更新min。同理,更新...原创 2010-09-21 17:15:53 · 144 阅读 · 0 评论 -
2.7 最大公约数问题
1,方法一:最经典的辗转相除法.[code="c++"]int gcd(int x, int y){ return (!y)? x:gcd(y, x % y);}[/code]缺点:取模运算开销较大,容易成为瓶颈.2,方法二:[code="c++"]int gcd(int x, int y){ if (x < y) return gcd...原创 2010-09-21 17:15:01 · 125 阅读 · 0 评论 -
2.17 数组循环移位
1,题意:把一个含有N个元素的数组循环右移K位.2,注意:这里有个潜在的误区,一般人都会假设K < N.3,实现代码:[code="c++"]void Reverse(int data[], int b, int e){ while (b < e) { data[b] ^= data[e]; data[e] ^= data[b]; data[b...原创 2010-09-21 17:12:30 · 90 阅读 · 0 评论 -
2.18 数组分割
1,题意:2n个正整数,分成两组n,使其和最接近.2,思路:动态规划: isOK[i][v]表示是否可以找打i个数,使得他们之和等于v.[code="c++"]#include #include #include using namespace std;const int m = 0xffff;bool isOK[100][m];void Hal...原创 2010-09-21 17:11:35 · 119 阅读 · 0 评论 -
2.21 只考加法的面试题
1,如果N可以分解为几个连续整数的和,则N的因式分解必然要有奇数。证明如下: a. 首先证明,只要N的因式分解中有奇数,N就能表示为自然数连和。 如果N的因式分解中有奇数,假设为s,且N= k * s, [b]如果k > s/2,[/b] 则 N可以表示为这个序列的和:k - (s / 2), k - (s / 2) + 1 ... k + ...原创 2010-09-21 17:02:53 · 109 阅读 · 0 评论 -
2.3 寻找发帖"水王"
1,问题实质:寻找数组中出现的半数以上的数.[code="c++"]int MoreHalfNum(int data[], int n){ int ret; int nTime = 0; for (int i = 0; i < n; ++i) { if (nTime == 0) { r...原创 2010-09-21 17:01:27 · 108 阅读 · 0 评论 -
2.2 不要被阶乘吓到
1,问题一:N的阶乘N!末尾有多少个0呢?解答:问题可转化为N!的质因数分解中5的个数.[code="c++"]int ZeroNum(int n){ int ret; //注:第一次循环表示5^1的倍数,每个贡献一个5 //第二次表示5^2的倍数,也会额外多贡献一个5 //...一次类推 while (n) {...原创 2010-09-21 16:58:37 · 134 阅读 · 0 评论 -
3.4 从无头单链表中删除节点
1,一段实例代码:[code="c++"]void DeleteListNode(node* pCurrent){ assert(pCurrent != NULL); node* pNext = pCurrent -> next; if (pNext == NULL) pCurrent = NULL; else { pCurrent -> next = ...原创 2010-09-21 17:21:12 · 88 阅读 · 0 评论