摘要: 一组排列就是一组N个整数的数组,其中0~N-1的每个数都只出现一次。两个排列之间的Kendall tau距离就是在两组排列中相对顺序不同的数对的数目。例如,0 3 1 6 2 5 4和1 0 3 6 4 2 5之间的Kendall tau距离是4,因为0-1、3-1、2-4、5-4这4对数字在两组排列中的相对顺序不同,但其他数字的相对顺序都是相同的。求两个指定数组的Kendall tau距离的代码如下:// 如果数组itemsB是有序数组,那么问题就转化为统计数组itemsA中的逆序对(参见《剑指Offer》面试题36)。而在一般情况下,问题可转化为统计数组itemsA中按照数组items.. 阅读全文
posted @ 2013-12-15 11:18 姚来飞 阅读(1882) 评论(0) 推荐(0) 编辑
摘要: 在对一个链表进行随机化时,可以借鉴自顶向下归并排序的思路,先将链表划分为左右两个子链表,分别进行随机化,然后再归并两个子链表,并在归并过程中进行随机化,代码如下:// *pHead指向链表的首节点(不是头结点)void RandomizeLinkedList(Link * pHead){ int length = CountNodes(* pHead); Randomize(pHead,length); Link tail = * pHead; for(int i = 1;i next; } tail->next = NULL;}// 随机化首节点由*pHead指向,长度为... 阅读全文
posted @ 2013-12-15 11:01 姚来飞 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 双调数组是指所有元素先递增后递减的数组,对其进行二分查找时,应先用二分查找找出数组中的最大项,再对左右两个单调子数组进行二分查找。代码如下:Item BitonicSearch(Item bitonicArray[],int length,int searchKey){ if((bitonicArray == NULL) || (lenght <= 0)) { return NULLItem; } int indexOfMaxItem = GetIndexOfMaxItem(bitonicArray,length); // 获取针对双调数组的递增部分的搜索结果 Item result = 阅读全文
posted @ 2013-12-14 10:55 姚来飞 阅读(633) 评论(0) 推荐(0) 编辑
摘要: a[]:01230.10.20.30.4cumsums[]:(cumsums[i]表示返回值小于i的概率)012340.00.10.30.61.0static double cumsums[];void GetCumsums(double a[],double cumsums[],int length) (length=5){ cumsums[0] = 0.0; for(int index = 1;index < length;index++) { cumsums[index] = cumsums[index - 1] + a[index - 1]; }}int Discrete(dou 阅读全文
posted @ 2013-12-13 21:04 姚来飞 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 解析用空格分隔单词的字符串:void Analysis(char string[]){ if(string == NULL) { return; } int index = 0; while(isspace(string[index])) { index++; } int startIndexOfWord = index; int endIndexOfWord; while(string[index] != '\0') { if(isspace(string[index])) { endIndexOfWord = index - 1; ParseWord(string,star 阅读全文
posted @ 2013-12-13 20:05 姚来飞 阅读(200) 评论(0) 推荐(0) 编辑
摘要: void Print1ToMaxOfNDigits(int n){ if(n = 0;i--) { printf("%d",number[i]); } printf("\n");} 阅读全文
posted @ 2013-11-17 11:16 姚来飞 阅读(234) 评论(0) 推荐(0) 编辑
摘要: [问题]一个整数数组中每个数均出现三次,只有一个数只出现一次。找出这个数。[解析]如果这里的数不是出现三次而是出现两次,我们可以使用异或的方式将所有的数进行异或,最后的结果自然是仅出现一次的数。受此启发,这里考虑将整数表达成3进制,每一位的异或操作:1xo0=12xo0=20xo0=01x01=21xo2=02xo2=1这样,相同的三个数的同一位的异或值一定为0,0与x的异或等于x。通过将所有的数表示成三进制,一起异或,最后的结果为即仅出现一次的数 阅读全文
posted @ 2013-11-17 10:10 姚来飞 阅读(353) 评论(1) 推荐(0) 编辑
摘要: [问题]有1023个苹果,有无数个箱子,怎样将这1023个苹果放到最少数量的箱子里,使我随意说出一个1024以内的数字,都能用箱子组合起来使得苹果数量等于那个数字。[解析]每个箱子分别存放1,2,4,8,……,512个苹果。因为整数都能写成二进制形式,所以按照二进制到十进制的转化过程就能够写成2的幂次方相加的形式,所以按照这样放能够表示出所有数字,而且箱子最少。 阅读全文
posted @ 2013-11-17 09:50 姚来飞 阅读(258) 评论(0) 推荐(0) 编辑
摘要: [问题]假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配,比如:abcda和adabc,由于出现的字符个数都是相同,只是顺序不同,所以这两个字符串是匹配的。要求高效:bool IsMatch(char *str1,char *str2) { int counters[R]; while(*str1 != '/0' && *str2 != '/0') { ++counters[*str1++]; --counters[*str2++]; } if (*str1 != '/0' || *str2 != '/0& 阅读全文
posted @ 2013-10-26 23:05 姚来飞 阅读(203) 评论(1) 推荐(0) 编辑
摘要: 1.猜数字问题: A、B两个人在玩猜数字游戏,A随机写了一个数字,在[1,100]区间之内,将这个数字写在了一张纸上,然后B来猜。 如果B猜的数字偏小的话,A会提示:“数字偏小” 一旦B猜的数字偏大的话,A以后就再也不会提示了,只会回答“猜对或猜错” 问:乙至少猜(13)多少次才可以准确猜出这个数字,在这种策略下,乙猜的第一个数字是(13)[解析]: 首先阅读题目,一个很重要的信息点就是:一旦B某次猜的偏大,A就不再提示,此次之后B猜的偏小A也不会再提示,只回答猜对与否。如果没有这个条件,或者说改变这个条件,改为:如果B猜的偏大,A会提示B这次猜的偏大那么相信大家都会给出答案,那... 阅读全文
posted @ 2013-10-26 23:02 姚来飞 阅读(1183) 评论(0) 推荐(0) 编辑