看大神文章小结——微软等面试 18,19

来源:互联网 发布:qt网络编程传送字符串 编辑:程序博客网 时间:2024/06/16 10:50

大神 地址 :http://blog.csdn.net/v_JULY_v/article/details/6015165

第 18 题(数组):
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,
每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个
数字)。当一个数字删除后,从被删除数字的下一个继续删除第 m 个数字。
求出在这个圆圈中剩下的最后一个数字。
July:我想,这个题目,不少人已经见识过了


没有见识过。。。。。孤陋顾问了。 看到这个题目 我第一个反应是 用链表 不停的 做下去 肯定能得到的啊。。估计这个方法太笨重了? 还是按照我的想法来做一边吧。  其实 取余 就有点是 环链表的 感觉了。

 

public static void main(String[] args) {int[] data={1,2,3,4,5,6,7,8,9,10};int index =0;int count =3;int countIndex=0;int findCount=0;while(findCount<data.length-1){//h还没有全部找出来 就做循环index=index%data.length;if(data[index]!=0){countIndex++;}if(countIndex==count){countIndex=0;findCount++;System.out.println("qudiao:"+data[index]);data[index]=0;}index++;}for(int i=0;i<data.length;i++){if(data[i]!=0){System.out.println("/////"+i);System.out.println("/////"+data[i]);}}}

第19题:
题目:定义 Fibonacci 数列如下:
/ 0 n=0
f(n)= 1 n=1,2
\ f(n-1)+f(n-2) n>2
输入 n,用最快的方法求该数列的第 n 项。
分析:在很多 C 语言教科书中讲到递归函数的时候,都会用 Fibonacci 作为例子。
因此很多程序员对这道题的递归解法非常熟悉,但....呵呵,你知道的。 。
//0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597..........
//注意,当求第100项,甚至更大的项时,请确保你用什么类型,长整型?or long long int
存储。
//不然,计算机,将 得不到结果


题目实现不难 难在 最快 2个字。  大家都会想到递归。 可是递归的速度 以及需要 栈 空间需求也大。 对于大数据 压根不行。估计不可以那么些 递归的写法就不写了 很简单  考虑其他的思路  有点想不到 看了下提示。。 

就是 从前 往后算 不用递归。我试试2种 效率区别。

试了一下 n到 40以上 差别 巨大。。

代码如下

public long recursive(int n){if(n<=0){return 0;}else if(n<=2){return 1;}//System.out.println(n);return recursive(n-1)+recursive(n-2);}public long notRecursive(int n){int index=3;//就从第三个数开始算。 前面是1,1 没必要纠结了。  long pre=1;//第而个数是1long prepre=1;//第一个数是1long total=0;while(index<=n){total=pre+prepre;long tem=pre;prepre=pre;pre=total;index++;}return total;}

说明递归 的确坑爹。 上次我有个玩递归的地方 记得 不是很大 一直内存溢出。 以后 注意 尽量不要递归。 这个例子 如果到100 都不知道要多久才能算出来。至于说的 logN的 复杂度的算法 我是想不出来。。。



原创粉丝点击