- 博客(10)
- 资源 (16)
- 收藏
- 关注
原创 移除字符串中重复的字符
设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。 void fun(char s[]) { int len = strlen(s); if (len < 2) { return; } bool flag[256]; memset(flag, false, sizeof(flag));
2014-03-23 13:06:34 573
原创 特殊的二进制数
大家都熟悉二进制,下面介绍一种特殊的二进制数。第k(k从0开始)位代表的权值是2^(k + 1) - 1,允许0,1,2三种数字出现,但是2只能出现在最低的非0位上。例如数10120 10120 = 1 * (2^5-1) + 0 * (2^4-1) + 1 * (2^3-1) + 2 * (2^2-1) + 0 * (2^1-1) = 31 + 0 + 7 + 6 +
2014-03-21 00:42:18 1236
原创 不用除法构造数组
给定一数组a[N],我们希望构造数组b [N],其中b[j]=a[0]*a[1]…a[N-1] / a[j],在构造过程中,不允许使用除法: 要求O(1)空间复杂度和O(n)的时间复杂度; 除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、堆空间和全局静态变量等); 思路:先在b[i] 中保留i之前的乘积,再在b[0]保存从最后开始逐次的乘积,b[i]和b[0]的
2014-03-13 22:40:30 726
原创 快速计算整数的幂
int power(int a, unsigned int n) { int factor = a; int result = 1; while (n) { while (!(n & 1)) { factor *= factor; n >>= 1; } result *= factor; factor *= factor
2014-03-13 00:23:18 782
原创 数组中的逆序对数
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。 #include #include using namespace std; int co
2014-03-12 22:58:51 1080
原创 查找数组中重复的数
一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间复杂度和O(n)时间复杂度。 int fun(int a[], int n) { for(int i = 0; i < n; i++) { a[a[i]%n] += n; } int label = 2*n; for (int i = 0; i <
2014-03-12 00:22:39 768
原创 步长为一的数组中找数
有这样一个数组A,大小为n,相邻元素差的绝对值都是1。如:A={4,5,6,5,6,7,8,9,10,9}。现在,给定A和目标整数t,请找到t在A中的位置。除了依次遍历,还有更好的方法么? #include #include #include #include using namespace std; int fun(int a[], int n, int k) { i
2014-03-11 22:38:07 1503
原创 数组中只出现一次的两个数字
在一个数组中除两个数字只出现1次外,其它数字都出现了2次, 要求尽快找出这两个数字。 #include using namespace std; void fun(int a[], int n) { int temp = 0; for (int i = 0; i < n; i++) { temp ^= a[i]; } int bitFactor = 1; while
2014-03-11 00:41:40 557
原创 数组中只出现一次的数
数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次。请给出最快的方法找到x。 #include #include using namespace std; int fun(int a[], int n) { int bitCounts[32]; memset(bitCounts, 0, 32*sizeof(int)); for (int
2014-03-09 00:42:45 615
原创 0-1背包问题
有n个物品。第i个物品的体积为Vi,重量为Wi。选一些物品装到一个容量为C的背包,使得背包内物品在总体积不超过C的前提下重量尽量大。1<=n<=100, 1<=Vi<=C<=1000,1<=Wi<=10^6。 思路: dp[i][j]表示在第i个物品之后的物品中取出容量等于j的体积的最大重量。 dp[i][j] = max(dp[i+1][j], ...
2014-03-07 01:29:46 586
exceptional c++ style中文版 pdf 刘未鹏译
2010-09-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人