代码改变世界

随笔分类 -  算法---大数+数论

通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小

2015-03-12 19:50 by youxin, 1418 阅读, 收藏, 编辑
摘要: 题目描述:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小。例如:var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40];分析:很多情况下,贪心算法得到的解并不... 阅读全文

转:在0~N(不包括N)范围内随机生成一个长度为M(M <= N)且内容不重复的数组

2015-03-11 17:07 by youxin, 920 阅读, 收藏, 编辑
摘要: 1.最朴素暴力的做法.void cal1(){ int i = 0, j = 0, num = 0; int result[M]; result[0] = rand() % N; //第一个肯定不重复, 直接加进去 for (i = 1; i s; int nu... 阅读全文

螺旋式打印一个二维数组

2014-07-09 14:30 by youxin, 1700 阅读, 收藏, 编辑
摘要: 问题描述:螺旋式打印一个二维数组。如11632178643232578122124613要求打印后顺序为:11632172312136422128643875此题的思路有很多中,最容易想到的方法就是设置一个表示方向的变量,根据当前的方向来判断下一步的操作,当到达边界的时候方向顺时针改变。另外有一个b... 阅读全文

矩阵转置 O(1)空间

2013-10-07 19:04 by youxin, 828 阅读, 收藏, 编辑
摘要: 题目:用O(1)的空间实现矩阵的转置为了方便,使用一维数组来分析。所谓矩阵转置,行变列,列变行。在转置的过程中,有的元素位置是不变的;对于变化位置的元素,要求O(1)空间完成,那么这些位置的变化一定是有着规律的。举例,2×5的矩阵,A={0,1,2,3,4,5,6,7,8,9};转置后为AT={0,5,1,6,2,7,3,8,4,9},探索下标变化:0->01->2->4->8->7->5->13->6->39->9这些下标的变化是一些环,如果我们能找到这个环,对环做移动处理,就可以O(1)完成了。现在的问题是,我们如何知道 阅读全文

逆序数的求法

2013-10-05 22:10 by youxin, 23809 阅读, 收藏, 编辑
摘要: 逆序数:也是就说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。在一个排列中,如果一对数的前后位置与大小顺序相反... 阅读全文

编程珠玑I算法总结

2013-10-05 16:10 by youxin, 768 阅读, 收藏, 编辑
摘要: 主要是根据编程珠玑后面的Algorithm附录总结了一下这本书里面的经典算法。1 辗转相减求最大公约数思想:最大公约数能整除i和j,则其一定也能整除i-j(if i>j)int gcd(int i, int j) { while(i != j) { if(i > j) i-=j; else j-=i; } return i; }2 快速求取x的n次方思想:充分利用了已经计算出来的数据防止重复计算来减少了算法运行时间function exp(x,n) //pre n>=0 //post result = x^n { if n=0 return 1; else if even(n 阅读全文

一个大小为N的数组,里面是N个整数,怎样去除重复的数

2013-10-05 05:28 by youxin, 690 阅读, 收藏, 编辑
摘要: 题目:一个大小为N的数组,里面是N个整数,怎样去除重复的数字;要求时间复杂度为O(n),空间复杂度为O(1).需要除掉重复的整数的数组,注意这里我没有处理负数情况,其实负数情况只要先用0快排分一下组,然后各自用以下算法进行处理即可。另外因为是整数,这里没考虑32位符号位,只考虑31位。题目分析:从要求来看,如果一个数组是排好序的,除掉重复就很简单,因此就转换成了排序算法寻找,这种算法需要满足:线性时间,常量内存,原地置换。但纵观这么多算法,比较排序肯定不行,那么就只有基数排序,桶排序和计数排序,计数排序排除,因为计数排序无法原地置换,桶排序也需要辅助空间,所以最后考虑用基数排序,基数排序依赖于 阅读全文

面试题之数组统计

2013-10-03 01:26 by youxin, 709 阅读, 收藏, 编辑
摘要: 题目:给定数组A,大小为n,数组元素为0到n-1的数字,不过有的数字出现了多次,有的数字没有出现。请给出算法和程序,统计哪些数字没有出现,哪些数字出现了多少次。要求在O(n)的时间复杂度,O(1)的空间复杂度下完成。问题的难点在于时间和空间复杂度。O(1)的空间含义,可以使用变量,但不能开辟数组或者map等来计数。解法一:直接用两层遍历,O(n^2)的时间复杂度,O(1)的空间复杂度。效率太低.#include #include int main(){ int n, i, j, count = 0; //n is The length of the Array while ... 阅读全文

面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)

2013-10-02 23:49 by youxin, 20227 阅读, 收藏, 编辑
摘要: 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:这是一道很新颖的关于位运算的面试题。首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一... 阅读全文

数组Magic Index

2013-10-02 23:02 by youxin, 844 阅读, 收藏, 编辑
摘要: QuestionA magic index in an array A[1...n-1] is defined to be an index such that A[i] = i. Given a sorted array of distinct integers, write a method to find a magic index, if one exists, in array A. FOLLOW UP What if the values are not distinct?给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A[i] 阅读全文

部分有序中查找给定值-【百度面试题】循环有序数组的查找问题

2013-10-02 17:09 by youxin, 1815 阅读, 收藏, 编辑
摘要: 问题:有一个循环有序数组A,如{7,8,9,0,1,2,3,4,5,6},不知道其最小值的位置。那么如何从这样的数组中寻找一个特定的元素呢?(循环有序满足以下条件之一:1.数组所有元素相等2.数组是个有序数列,这时候分界点就是第一个元素的位置3.总能找到一个位置(也是只有唯一一个位置)从那个位置开始,左边是个递增序列,右边也是一个有序序列,且最后一个元素小于或者等于第一个元素。(也就是首尾相连为 有序的)。)问题分析:我们可以把循环有序数组分为左右两部分(以mid = (low+high)/ 2为界),由循环有序数组的特点知,左右两部分必有一部分是有序的,我们可以找出有序的这部分,然后看所查找 阅读全文

javascript集合求交集

2013-09-27 16:08 by youxin, 2212 阅读, 收藏, 编辑
摘要: 两集合求交集思路:1. 每一次从B数组中取一值,然后在A数组里逐个比较,如果有相等的,则保存。该算法复杂度为 O(MN). M, N 分别为数组 A B 的长度。2. 因为A B 都排过序,所以,每一次从B数组取值后,可以利用二分查找看是否在数组A里有B所对应的值,这样复杂度变成了O(N lg M)... 阅读全文

百度面试题:求绝对值最小的数

2013-09-10 19:52 by youxin, 883 阅读, 收藏, 编辑
摘要: 有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。我们首先要看到,是已经排序的。算法实现的基本思路三种情况:全负数 全正数 正负皆有1:取最右 时间复杂度为o(1)2:取最左 时间复杂度为o(1)3:二分查找0, 找到为最小,否则最后查找区间,左右取绝对值最小,时间复杂度为o(log2 n)这个二分查找还是有点难写的,如果arr[mid]为正,还要分arr[mid-1]是否为负,若为负,则一定是arr[m 阅读全文

位运算技巧4

2013-09-03 21:48 by youxin, 535 阅读, 收藏, 编辑
摘要: 位运算进制转换:要求:分别实现十进制整数按二进制、十六进制输出。两种方法实现按二进制输出:方法1:由于整数在计算机中是按二进制存储的,我们只需要将其每个bit按顺序打印出来即可,如果某位为1,则打印字符‘1’,否则打印字符‘0’。我给出的代码如下:void printBinary(int num){ for(int i=0;i>(31-i))&1); //cout bits(num); for(int i=31;i>=0;i--) { cout=0;i-=4) { int tmp=num>>i; tmp=tmp&... 阅读全文

面试题:对一个正整数n,算得到1需要的最少操作次数

2013-09-02 22:58 by youxin, 956 阅读, 收藏, 编辑
摘要: 实现一个函数,对一个正整数n,算得到1需要的最少操作次数。操作规则为:如果n为偶数,将其除以2;如果n为奇数,可以加1或减1;一直处理下去。例子:func(7) = 4,可以证明最少需要4次运算n = 7n-1 6n/2 3n-1 2n/2 1要求:实现函数(实现尽可能高效) int func(unsign int n);n为输入,返回最小的运算次数。给出思路(文字描述),完成代码,并分析你算法的时间复杂度。http://www.360doc.com/content/10/0909/18/2982742_52434261.shtmlhttp://www.cnblogs.com/dartagna 阅读全文

转:二进制乘法原理

2013-09-02 22:53 by youxin, 1420 阅读, 收藏, 编辑
摘要: 二进制乘法实际上就是左移和加法,假设被乘数是a,我们将乘数分解为2^n + 2^m + 2^k ...,则乘法结果为:a<<n + a<<m+a<<k ... ,以下题为例:4. What is the result of binary number 01011001 after multiplying by 0111001 and adding 1101110?(A) 0001 0100 0011 1111(B) 0101 0111 0111 0011(C) 0011 0100 0011 0101其乘法过程就是: 01011001<<5 + 0 阅读全文

面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

2013-09-02 22:49 by youxin, 8664 阅读, 收藏, 编辑
摘要: 题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字。(原数组不必保留)方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同。时间复杂度为O(nlogn),空间复杂度为O(1)。方法2.使用bitmap方法。定义长度为N/8的char数组,每个bit表示对应数字是否出现过。遍历数组,使用 bitmap对数字是否出现进行统计。时间复杂度为O(n),空间复杂度为O(n)。方法3.遍历数组,假设第 i 个位置的数字为 j ,则通过交换将 j 换到下标为 j 的位置上。直到所有数字都出现在自己对应的下标处,或发生了冲突。时间复杂度为O(n),空间复杂度为 阅读全文

位运算技巧3

2013-09-02 21:40 by youxin, 961 阅读, 收藏, 编辑
摘要: 检测一个无符号数是不为2^n-1(^为幂):x&(x+1)将最右侧0位改为1位:x | (x+1)二进制补码运算公式:-x = ~x + 1 = ~(x-1)~x = -x-1-(~x) = x+1~(-x) = x-1x+y = x - ~y - 1= (x|y)+(x&y)x-y = x + ~y + 1 = (x|~y)-(~x&y)x^y = (x|y)-(x&y)x|y = (x&~y)+yx&y = (~x|y)-~xx==y:~(x-y|y-x)x!=y:x-y|y-xx> 31 ;return (x^y)-y ;//or: 阅读全文

位运算技巧2

2013-09-02 21:36 by youxin, 718 阅读, 收藏, 编辑
摘要: 题目:一个数组中有多个整数,其中只有一个没有重复过,求出该数:考虑使用异或操作帮助实现。int AppearOnce(int data[], int length){ int i; int once = 0; for (i = 0; i T abs_Normal(T tNum){if(tNum>0.0)returntNum;elsereturn-tNum;}也就是说我们会用到一个if-else判断来决定是否反转符号位。在3D游戏软件,或一些对性能要求比较高的底层系统中,当大规模的求绝对值时,这个if-else结构会带来性能上的损失,那么,如何来消除if-else结构呢?或许会... 阅读全文

位运算 技巧1

2013-09-02 00:22 by youxin, 441 阅读, 收藏, 编辑
摘要: 如果要对一个整数中的某些位进行操作,怎样表示这些位在整数中的位置呢?可以用掩码(Mask)来表示。比如掩码0x0000ff00表示对一个32位整数的8~15位进行操作,举例如下。1、取出8~15位。unsigned int a, b, mask = 0x0000ff00;a = 0x12345678;b = (a & mask) >> 8; /* 0x00000056 */这样也可以达到同样的效果:b = (a >> 8) & ~(~0U void main(){int a=-2147483647;a=a<<1;printf("%d 阅读全文
点击右上角即可分享
微信分享提示