代码改变世界

迅雷100题:逻辑运算和类

2011-06-13 15:50 by x_feng, 230 阅读, 0 推荐, 收藏, 编辑
摘要:答案:A,!x++,!和++的优先级相同,但是是右结合的,相当于!(x++)。 答案:B,其实我觉得每个都对,如果非要计较B中while(a<=10)后面少个“;”号的话。 答案:B。类的内联可以在类内和类外定义 答案:D。A)static数据成员不可以在类内初始化,只能在类外初始化,格式: <数据类型><类名>::<静态数据成员名>=<值>,除非是const static 类型的数据成员可以在... 阅读全文

Programe_Of_Beauty:2.17 数组循环位移

2011-06-12 17:29 by x_feng, 157 阅读, 0 推荐, 收藏, 编辑
摘要:问题:把一个N个元素的数组循环右移K位,要求时间复杂度为O(N)。解析:如abcd1234右移4位 要变成1234abcd1,逆序排列abcd->dcba12342,逆序排列1234->dcba43213,逆序排列dcba4321代码如下:void Reverse(int * arr, int beg, int end){ for (; beg < end ; beg++, end—) { int temp = arr[beg]; arr[beg] = arr[end]; arr[end] = temp; }}void RightSift(int* arr, int N, i 阅读全文

Programe_Of_Beauty:2.16 求数组中最长递增子序列

2011-06-12 14:05 by x_feng, 175 阅读, 0 推荐, 收藏, 编辑
摘要:问题:写一个时间复杂度尽可能低的程序,求一个一维数组中最长递增子序列的长度。如1,-1,2,-3,4,-5,6,-7.最长递增子序列:1,2,4,6或者-1,2,4,6… 分析:我们发现2前面是1或者-1对后面没有影响。用i来遍历数组。i=0时,arr[i] = 1就一个数,这时最长递增子序列为{1},i=1时,-1<1所以对-1来说,目前最长递增子序列为{-1}为1,i= 2时,2>1,2>-1对2来说,最长递增子序列为{1,2}或{-1,2}长度为2,当i = 3时,-3小于1,-1,2.所以当前最长子序列依然是{1,2}或{-1,2}长度为2,当i= 4时,4>- 阅读全文

Programe_Of_Beauty:2.14 求数组的子数组之和的最大值

2011-06-12 10:09 by x_feng, 163 阅读, 0 推荐, 收藏, 编辑
摘要:问题:一个有N个整数元素的一维数组,那么求子数组和的最大值。分析:首先我们明确问题,子数组是联系的,不用返回元素的位置,元素是整数,可能为正,负或0。我们来看看最经典的解法:a[0],a[1]…a[N-1],用分治的思想,a[0]和a[1]…a[N-1],是什么关系呢?a[1]…a[N-1],包含两部分,1,以a[1]为开头的最大值,2,a[1]…a[N-1],有一个最大值,那么我们只要比较{a[0],a[0]+以a[1]开头的最大值,a[1]…a[N-1]之间的最大值}就可以得出结果,那么a[1]与a[2]…a[N-1]呢?也一样……a[N-2]与a[N-1]呢?代码如下:void Find 阅读全文

Programe_Of_Beauty:2.13 子数组的最大乘积

2011-06-12 00:07 by x_feng, 209 阅读, 0 推荐, 收藏, 编辑
摘要:问题:给定一个长度为N的整数数组,只允许用乘法,不用除法,计算任意N-1个数的组合中乘积最大的一组。具体思想不再赘述,代码如下:#ifndef _SUB_ARRAY_MAX_MULTIPLY_H_#define _SUB_ARRAY_MAX_MULTIPLY_H_#include <iostream>using namespace std;//方法一void SubArryMaxMultiply_Calculate(int* array, int size){ if (NULL == array) { return; } int* a = new int[size]; int* b 阅读全文

Programe_Of_Beauty:2.12 快速寻找满足条件的两个数

2011-06-11 23:09 by x_feng, 171 阅读, 0 推荐, 收藏, 编辑
摘要:问题:能否快速找出数组中两个数字,让这两个数字之和等于一个给定的值,为了简单起见,假设这个数组中肯定存在至少一组符合要求的解。解法一:用两层循环,时间复杂度为O(N*N),不可取。解法二:先用快速排序,然后从两端向中间找,时间复杂度为O(Nlog2N)。代码如下:int Partion(int* arr, int p, int r){ int temp; int i = p; int j = r; temp = arr[i]; do { while(arr[j] >= temp && i < j) { j--; } if (i < j) { arr[i++] 阅读全文

Programe_Of_Beauty:2.4 1的数目

2011-06-11 18:02 by x_feng, 196 阅读, 0 推荐, 收藏, 编辑
摘要:问题:给定一个十进制正整数N,写下从1到N的所有整数,然后数一下其中出现的所有1的个数。书上解法一:最简单的方法从1遍历每一个数,算算每个数中1出现的次数,具体代码如下: 1: unsigned int countInteger(int n) 2: { 3: unsigned int num = 0; 4: while(n != 0) 5: { 6: num += (n % 10 == 1) ? 1:0; 7: n /= 10; 8: } 9: return num; 10: } 11: void OneNumber(unsigned int n) 12: { 13: unsigned int 阅读全文

迅雷100题:树、栈和队列

2011-06-08 14:38 by x_feng, 187 阅读, 0 推荐, 收藏, 编辑
摘要:答案:B,解析:其实4个选项前3个节点就能得到答案,后续遍历的最后一个节点a就是根节点,中序遍历a以前的都是a的左子树节点,只有一个b,defcg都是a的右子树,由于后续遍历a的前面是d,所以d必定是a的右子树的根节点,而中序遍历a的后边也是d,这说明,d没有左子树,因此,前序遍历的前三个节点为:abd。具体的树结构如下: 答案显然。 答案:D,以上都有可能 答案:A,解析:首先这棵树是完全二... 阅读全文

Programe_Of_Beauty:2.3 寻找发帖“水王”及扩展问题

2011-06-06 15:44 by x_feng, 247 阅读, 0 推荐, 收藏, 编辑
摘要:问题:其实问题可以简单的说:有一个数组,数组中的某个元素出现的次数超过N/2。问有没有很好的方法快速找到这个元素。解析:如:char ID[5] = { ‘a’,‘b’,‘a’,‘c’,‘a’};a的出现次数为3。一个很高效的方法就是:当两个元素不相同时就把这两个元素都删除,这样最后剩下的就是要找的元素,当然不一定是真的删除。#ifndef _2_3_TANGO_H_#define _2_3_TANGO_H_//2.3寻找发帖水王 p129#include <iostream>//本题目的含义是,在一个序列中寻找出现次数最多的id,如a,a,b,c,a,b,a,a 当然a出现次数最 阅读全文

Programe_Of_Beauty:2.2 不要被阶乘吓到

2011-06-06 13:54 by x_feng, 230 阅读, 0 推荐, 收藏, 编辑
摘要:问题1:给定一个整数N,那么N的阶乘N!末尾有多少个0呢?例如:N=10,N!=3628800,末尾有2个0.问题2:求N!的二进制表示中最低位1的位置?问题1书上的解析一:例如N=10,我们发现这个数中5*2=10,如N=100呢?5*20=100,5*4=20,…如果一个数中有几个5那么这个数就贡献几个0.只要计算N!中出现多少次5就能确定末尾有多少个0.num = 0;for (int i = 1; i <=N; i++)//计算阶乘中每一个数中5出现的次数{ int j = i; while(j %5 == 0)//说明能被5整除,有一个5 { num++; j = j/5; } 阅读全文