摘要: 又一个经典问题,貌似很多公司笔试都考过这个问题的非递归程序求解。下面是我的递归与非递归程序,个人感觉程序逻辑还是比较清晰:)。int board[8][8];int cnt = 0;bool isValid(int i, int j){ int k; for(k = 0; k < 8; ++k) if(k != j && board[i][k]) return false; for(k = 0; k < 8; ++k) if(k != i && board[k][j]) return false; for(k = 1; k < 8 && 阅读全文
posted @ 2012-10-06 10:07 segeon 阅读(1255) 评论(0) 推荐(0)
摘要: 题目描述:有12个外形一样的球,其中一个球质量不同于其他球,其他球质量相同,现有一个天平,没有砝码,只能称出哪边轻哪边重。现要求称三次找出那个质量不同的球,并指出该球比其他球轻还是重。分析与解答:对于一次称量,如果天平平衡,说明两边的球都是普通球,要找的球肯定在剩余球中;如果天平不平衡,说明要找的球必定在天平某一边上,而剩余的球必定是普通球。如果将12个球平分成2组,第一次称量肯定不平衡,得不出任何结论。只能尝试将球平分成3堆和4堆。首先考虑分成3组的情况。给球分成ABC三组,编号分别为a1、a2、a3、a4,b1、b2、b3、b4,c1、c2、c3、c4。比较方法和结果如上图所示,图中“vs 阅读全文
posted @ 2012-10-05 12:01 segeon 阅读(1858) 评论(0) 推荐(0)
摘要: 这个问题的非一般形式在网上有很多的分析,比如http://blog.csdn.net/hackbuteer1/article/details/7481342、http://liuyangxdgs.blog.163.com/blog/static/2913776320111056839612/。下面将这个问题一般化,进一步分析这类问题的规律,找出一般性的解法。问题描述:一共有n*n匹马,有一个赛场,赛场有n个赛道,就是说最多同时可以有n匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能找出跑得最快的k匹马。设f(n,k)表示n*n匹马,n个赛道 阅读全文
posted @ 2012-09-16 15:21 segeon 阅读(1139) 评论(0) 推荐(0)
摘要: 问题描述:已知一个整数数组a[],其长度为n,要找出数组中相邻元素的最大间距。分析:问题很简单,而且描述本身就暗示了一种自然的求解方法,即先对元素排序,然后逐个求相邻元素的间距。这种解法的复杂度为O(n*logn)。再想一下,设min, max分别是数组中的最小和最大元素,len =(max-min... 阅读全文
posted @ 2012-09-15 11:53 segeon 阅读(2971) 评论(2) 推荐(0)
摘要: map对元素按照key按升序排序,比较的时候使用<操作符或者是程序员提供的比较函数。内置类型都定义了<操作符,可以直接作为key使用。自定义的类型如果要作为key,需要满足以下条件:1. 可复制和可赋值(这是容器对元素的基本要求)2. 元素类型定义了<操作符,或者定义一个专门的函数对象struct _temp{int a, b; bool operator<(const struct _temp &rhs) const { return a < rhs.a; }} ts;...map<struct _temp, int> my;或者struct 阅读全文
posted @ 2012-09-12 22:00 segeon 阅读(1751) 评论(0) 推荐(0)
摘要: 算法思想:利用向量叉积性质判断点和三角形边的相对位置关系。需要注意的是,在计算叉积之前需要先将三个顶点按顺时针或者逆时针方向排好序。叉积相关概念和性质参见:http://hi.baidu.com/zhubingn/item/cb63083e987b8cad134b14abhttp://en.wikipedia.org/wiki/Cross_product代码如下:#include <stdlib.h>#include <stdio.h>typedef struct _Point{ int x, y;}Point;void swap(Point *p1, Point *p 阅读全文
posted @ 2012-08-28 11:09 segeon 阅读(244) 评论(0) 推荐(0)
摘要: 前两天在复习数据结构二叉树部分的时候,看到当初在书上写的一个问题:怎么能找出和一个前序序列对应的所有可能的中序序列,问题末尾有一个大大的问号,想必当时自己肯定没想明白。今天重新想了一下,这个问题相当于求一个给定入栈序列所有可能的出栈序列,用回溯的方法来做。算法的基本思想:模拟一系列入栈出栈的过程,对于每一步操作,可能是入栈,也可能是出栈;如果所有元素都已入栈,那就将栈中元素都弹出,这就找到一个中序序列。代码如下:/* * root是前序序列,l表示入栈的第几个字符,stack,top不用说了,inTree用来保存当前得到的中序序列 */void inorderTrees(char *root, 阅读全文
posted @ 2012-08-07 10:22 segeon 阅读(1182) 评论(0) 推荐(0)
摘要: 很多书上都会讲到二分查找(数据结构与算法教材、《编程之美》、《编程珠玑》),这也是一个经典的面试题。尽管它很常见,大家也很熟悉,但是却不一定能够完美地写出来。今天自己整理了一下,把三种二分查找算法(找最后一次出现的某值v,找第一次出现的某值v和普通的二分查找)进行了梳理。问题描述:有一个按非降序排列的有序数组a[0...n-1]和一个数v1. 求数组a中最后一次出现的数v的下标设l为左边界,h为右边界,mid = (l+h)/2,那么,根据mid的取值,分三种情况:(1) a[mid] < v,说明v如果在数组中,应该出现在mid右侧,则调整左边界,l = mid + 1(2) a[mi 阅读全文
posted @ 2012-07-27 19:22 segeon 阅读(2064) 评论(0) 推荐(0)