摘要: 给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:不允许使用除法;要求O(1)空间复杂度和O(n)时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);请用程序实现并简单描述。虽然前不久做了一次,但手写还是错,临界问题未考虑清楚。。。。闷~现在查错不使用调试。。。下次要学会证明算法的正确性。 1 void func3(int a[], int b[], int n) 2 { 3 b[n-1] = 1; 4 5 for (int i=n-1; i>0... 阅读全文
posted @ 2013-03-19 19:56 legendmaner 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 11、求一个全排列函数:如p([1,2,3])输出: [123],[132],[213],[231],[321],[312].2、求一个组合函数如p([1,2,3])输出: [1],[2],[3],[1,2],[2,3],[1,3],[1,2,3]这两问可以用伪代码。void swap(int *a, int *b) //交换函数{ int tmp; tmp =*a; *a=*b; *b=tmp;}以为很简单,手写全排序第一遍就错了。func1( a[], n, m) if(m>n-1) return; end print(a); for(i=m+1... 阅读全文
posted @ 2013-03-19 16:38 legendmaner 阅读(805) 评论(0) 推荐(0) 编辑
摘要: 题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。解:如果只是最简单的遍历,时间复杂度为O(n)。这样不符合题意,而且也没有充分的利用题目的已知条件“排好序的数组”。这题目老早之前做过一次。印象中使用了两个指针p、q,一个指针p指向数组头,一个q指向末尾。指针p只往大的方向走;q只往小的方向走;比较这两值之和与指定数的大小关系。若大了,则q往小的方向走;若小了,则p往大的方向走; 阅读全文
posted @ 2013-03-18 19:13 legendmaner 阅读(604) 评论(0) 推荐(0) 编辑
摘要: Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法String extractSummary(String description,String[] key words)目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。 解:简化题目:从一个字符串A中找出包含另一个字符串B所有字母的最小字串。(比A短,并每个字母只出现一次;这里先排除了关键词多次出现的情况,这种情况只需稍微改动即可),考虑使用两个指针p、q指向A起... 阅读全文
posted @ 2013-03-17 21:54 legendmaner 阅读(600) 评论(0) 推荐(0) 编辑
摘要: 1 #include <iostream> 2 3 using namespace std; 4 5 6 void p(int a[], int n) 7 { 8 int *p,*q; 9 int tmp;10 11 p= a;12 q = a+n-1;13 14 while(p<q)15 {16 while(p<q && *p%2==1)17 p++;18 while(p<q && *q%2==0)19 q--;20 if (p<q)21 ... 阅读全文
posted @ 2013-03-16 21:01 legendmaner 阅读(317) 评论(0) 推荐(0) 编辑
摘要: 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。分析:把题目换一下,如果出现不同的数字只有一个,这可以很容易实现,即把所有的数字异或即可得出结果;可是,现在的题目是有两个不同的数字。全部异或的结果只能是这两个不同数字的异或。由于两个数字不同所以他们异或的结果不为0,即意味这两个不同的数字有其中的某一个比特位不同。所以可以根据这个比特为的不同将所有的数据分为两类,则这两个数字将分别在不同的分类中。此时分别对这两类按照之前的方法,把他们(同一类的数据)分别异或将得到这两个不同的数字。#include 阅读全文
posted @ 2013-03-16 20:48 legendmaner 阅读(203) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>using namespace std;#define STR_SIZE 1024#define PAR_SIZE 128char str[STR_SIZE] = {"abaababaddecab"};char par[PAR_SIZE] = {"abaabcaba"};void printarray(int *a, int size);int cal_k2(char *par, int *par_next, int k2, int j);void cal_next(char *par, int *par 阅读全文
posted @ 2012-12-02 21:53 legendmaner 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 简介:代码的性能优化是一项非常重要的工作。经常可以看到,采用 C 或 C++ 编写的、功能正确的软件在执行时耗费大量的内存、时间、或者在最糟的情况下既耗内存又费时间。作为一名开发人员,可以使用 C/C++ 提供的功能强大的工具来改进处理时间,并且防止内存破坏,这些工具其中之一是控制如何在代码中分配或者释放内存。忆一下 C/C++ 中内存管理的基础知识。执行时,malloc 和 new 将向操作系统内核请求内存,而 free 和 delete 则请求释放内存。这意味着,操作系统必须在每次提出内存请求时在用户空间代码和内核代码之间进行切换。反复调用 malloc 或者 new 的程序,最终将由于不 阅读全文
posted @ 2012-11-04 11:21 legendmaner 阅读(253) 评论(0) 推荐(0) 编辑
摘要: A*算法是游戏非常常用的寻路算法。至于其理论知识就不贴出来了,网上太多了。一开始也没有看理论性太强的东西,先实现了再说。其实刚看完算法就有一种特想证明其正确性的想法。自我感觉A*算法和动态规划的思想是相同的(动态规划其实也不是熟悉,运筹学白学了)。f(n) = g(n) + h(n);0.节点信息{节点位置,父节点,F值,G值,H值},确定起始节点和终结节点;1.初始化开启队列、关闭队列(开启队列表示等待探索的节点集,关闭队列表示已经探索过的节点),将起始点信息加入开启队列中;2.在开启队列中找出 F 值最小的节点。若队列为空则返回失败,即未能找到路线到达终点的。将节点转到关闭队列中,若节点为 阅读全文
posted @ 2012-11-01 20:03 legendmaner 阅读(297) 评论(0) 推荐(0) 编辑
摘要: // 5.查找最小的k个元素(数组)// 题目:输入n个整数,输出其中最小的k个。// 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。// 注:// 1 在数据量不大的情况下,排序// 2 维护一个最小k 的数组 ,复杂度 为 o(k * N)// 3 为一个最小K个数的最大堆 o(log2 k * N)//每次看这些小算法都不以为然,每次都巨耗时间,比我想象的要多的多啊.....#include <iostream>#define N 30using namespace std;int gheap[N] = {0};int count = 0 阅读全文
posted @ 2012-10-12 22:08 legendmaner 阅读(212) 评论(0) 推荐(0) 编辑