算法面试题算法笔试题
一个最小的自然数x,使它等于不同的两对自然数的三次幂之和
找一个最小的自然数x,使它等于不同的两对自然数的三次幂之和,即使得: x=a*a*a+b*b*b=c*c*c+d*d*d 其中a,b,c,d都是自然数,且有a!=c和b!=d 要求:输出满足要求的最小自然数的值。 int max = 1290; int[] Arr...... <阅读全文>
在不用第三方参数的情况下,交换两个参数的值
#include void main() { int i=60; int j=50; i=i+j; j=i-j; i=i-j; printf(“i=%d\n”,i); printf(“j=%d\n”,j); } 方法二...... <阅读全文>
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
有双向循环链表结点定义为: struct node { int data; struct node *front,*next; }; 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除 BOOL DeteleNode(No...... <阅读全文>
有1,2,….一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.
#include int main() { int a[] = {10,6,9,5,2,8,4,7,1,3}; int len = sizeof(a) / sizeof(int); int temp; for(int i = 0; i < len; ) { temp = a[a[i] – 1]; a[a[i] – 1] ...... <阅读全文>
用递归算法判断数组a[N]是否为一个递增数组
bool fun( int a[], int n ) { if( n= =1 ) return true; if( n= =2 ) return a[n-1] >= a[n-2]; return fun( a,n-1) && ( a[n-1] >= a[n-2] ); } Click me to Bookmark It! H...... <阅读全文>
已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。
slnodetype *Delete(slnodetype *Head,int key){}中if(Head->number==key) { Head=Pointer->next; free(Pointer); break; } Back = Pointer; Pointer=Pointer->next; if(Pointer->number==key) { ...... <阅读全文>
二叉树
目录: 1.二叉树三种周游(traversal)方式: 2.怎样从顶部开始逐层打印二叉树结点数据 3.如何判断一棵二叉树是否是平衡二叉树 4.设计一个算法,找出二叉树上任意两个节点的最近共同父结点,复杂度如果是O(n2)...... <阅读全文>
栈和队列
目录: 1.设计含min函数的栈,要求min、push和pop的时间复杂度都是o(1)。 2.设计含min函数的栈的另解 3.用两个栈实现队列 4.用两个队列实现栈 5.栈的push、pop序列是否一致 6.递归反转一个栈,要求不得...... <阅读全文>
删除单链表中重复的元素
用Hashtable辅助,遍历一遍单链表就能搞定。 实践中发现,curr从表头开始,每次判断下一个元素curr.Netx是否重复,如果重复直接使用curr.Next = curr.Next.Next; 就可以删除重复元素——这是最好的算法。唯一的...... <阅读全文>
单链表排序
无外乎是冒泡、选择、插入等排序方法。关键是交换算法,需要额外考虑。第7题我编写了一个交换算法,在本题的排序过程中,我们可以在外层和内层循环里面,捕捉到pre1和pre2,然后进行交换,而无需每次交换又要...... <阅读全文>
用链表模拟大整数加法运算
例如:9>9>9>NULL + 1>NULL => 1>0>0>0>NULL 肯定是使用递归啦,不然没办法解决进位+1问题,因为这时候要让前面的节点加1,而我们的单链表是永远指向前的。 此外对于999+1=1000,新得到的值的位数(4位)比原...... <阅读全文>
两个单链表相交,计算相交点
分别遍历两个单链表,计算出它们的长度M和N,假设M比N大,则长度M的链表先前进M-N,然后两个链表同时以步长1前进,前进的同时比较当前的元素,如果相同,则必是交点。 public static Link GetIntersect(Link h...... <阅读全文>
判断两个单链表是否相交
这道题有多种算法。 算法1:把第一个链表逐项存在hashtable中,遍历第2个链表的每一项,如果能在第一个链表中找到,则必然相交。 static bool JudgeIntersectLink1(Link head1, Link head2) { Hashtable h...... <阅读全文>
判断单链表是否有环?如何找到环的“起始”点?如何知道环的长度?
算法思想: 先分析是否有环。为此我们建立两个指针,从header一起向前跑,一个步长为1,一个步长为2,用while(直到步长2的跑到结尾)检查两个指针是否相等,直到找到为止。 static bool JudgeCircleExists(Li...... <阅读全文>
单链表交换任意两个元素(不包括表头)
先一次遍历找到这两个元素curr1和curr2,同时存储这两个元素的前驱元素pre1和pre2。 然后大换血 public static Link SwitchPoints(Link head, Link p, Link q) { if (p == head || q == head) thr...... <阅读全文>
有个二级单链表,其中每个元素都含有一个指向一个单链表的指针。写程序把这个二级链表展开称一级单链表
这个二级单链表只包括一些head: public class Link { public Link Next; public int Data; public Link(Link next, int data) { this.Next = next; this.Data = data; }...... <阅读全文>
两个不交叉的有序链表的合并
有两个有序链表,各自内部是有序的,但是两个链表之间是无序的。 算法思路:当然是循环逐项比较两个链表了,如果一个到了头,就不比较了,直接加上去。 注意,对于2个元素的Data相等(仅仅是Data相等哦,而不...... <阅读全文>
找出单链表的中间元素
算法思想:使用两个指针first和second,只是first每次走一步,second每次走两步: static Link GetMiddleOne(Link head) { Link first = head; Link second = head; while (first != null &&...... <阅读全文>
找出单链表的倒数第4个元素
这道题目有两种算法,但无论哪种算法,都要考虑单链表少于4个元素的情况: 第1种算法,建立两个指针,第一个先走4步,然后第2个指针也开始走,两个指针步伐(前进速度)一致。 static Link GetLast4thOne(Link...... <阅读全文>
单链表反转
这道题目有两种算法,既然是要反转,那么肯定是要破坏原有的数据结构的: 算法1:我们需要额外的两个变量来存储当前节点curr的下一个节点next、再下一个节点nextnext: public static Link ReverseLink1(Link ...... <阅读全文>