几道简单的面试题
来源:互联网 发布:java动态代理详解 编辑:程序博客网 时间:2024/04/29 10:57
1、寻找一个单向链表的倒数第n个节点;
2、二分查找以及二分查找寻找上下界;
3、求交叉链表的第一个交叉节点;
#include <assert.h>#include <stdio.h>#include <stdlib.h>using namespace std ;struct _link_node{ int data ; struct _link_node *next ;} ;struct _link_node* create_linklist(int data[],int len){ assert(data!=NULL) ; struct _link_node *pRoot = (struct _link_node*)malloc(sizeof(struct _link_node)) ; //pRoot->next = NULL ; struct _link_node *pTmp = pRoot ; for(int i=0;i<len;i++){ pTmp->next=(struct _link_node*)malloc(sizeof(struct _link_node)) ; pTmp->next->data = data[i] ; pTmp = pTmp->next ; } pTmp->next = NULL ; return pRoot ;}struct _link_node* print_link(struct _link_node* pRoot){ struct _link_node *pTmp = pRoot ; while(pTmp->next!=NULL){ printf("%d,",pTmp->next->data) ; pTmp=pTmp->next ; }}struct _link_node* get_reverse_n(struct _link_node* pRoot,int n){ assert(pRoot!=NULL) ; struct _link_node *pPre = pRoot ; struct _link_node *pTail = pRoot ; int cnt = 0 ; /*使用两个指针,第一个指针比第一个指针先走n步,两个指针再一起移动, 当先走指针走向末尾时,另外一个指针所指向的位置就是倒数第n个*/ while(cnt<n){ if(pPre==NULL){ return NULL ; } cnt++ ; pPre=pPre->next ; } while(pPre!=NULL&&pPre->next!=NULL){ pPre=pPre->next ; pTail=pTail->next ; } return pTail->next ;}void PrintMeet(){ int hour=0 ; int minutes=0 ; for(int i=1;i<6;i++){//模拟时针每走一小时,角度是30度 hour+=30 ; for(int j=0;j<60;j++){//模拟秒针走,一步角度为6; minutes+=6 ; if(minutes%360==hour){ printf("time=%d:%d\n",hour/30,minutes%360/6) ; } } }}int binary_search(int array[],int low,int high,int target){ if(low>high||array[high]<target){//advance abort return -1 ; } int mid = low+((high-low)>>1) ; while(low<=high){ mid = low+((high-low)>>1) ; if(array[mid]<target){ low = mid+1 ; }else if(array[mid]>target){ high = mid-1 ; }else{ return mid ; } } return -1 ;}int binary_search1(int array[],int low,int high,int target){ if(low>high){ return -1 ; }else{ int mid = low+((high-low)>>1) ; if(array[mid]>target){ high = mid-1 ; binary_search1(array,low,high,target) ; }else if(array[mid]<target){ low = mid + 1 ; binary_search1(array,low,high,target) ; }else{ return mid ; } }}int binary_find_upper_bound(int array[],int low,int high,int target){ if(low>high||array[high]<target){//advance abort return -1 ; } int mid =low + ((high-low)>>1) ; while(low<high){ if(array[mid]>target){ high = mid ; }else{ low = mid+1 ; } mid = low+((high-low)>>1) ; } return array[mid] ;}int binary_find_lower_bound(int array[],int low,int high,int target){ if(low>high||array[high]<target){//advance abort return -1 ; } int mid = low+((high-low)>>1) ; while(low<high){ if(array[mid]<target){ low = mid ; }else{ high=mid-1 ; } mid = low + ((high-low+1)>>1) ;//note:here we must add 1 to compute mid } return array[mid] ;}int find_first_cross_node(struct _link_node*pFirst, struct _link_node *pSecond){ assert(pFirst!=NULL&&pSecond!=NULL) ; int len_first=0 ; int len_second=0 ; struct _link_node *pTmp1=pFirst ; struct _link_node *pTmp2=pSecond ;//first compute length of the two link list while(pTmp1->next!=NULL){ pTmp1=pTmp1->next ; len_first++ ; } while(pTmp2->next!=NULL){ pTmp2=pTmp2->next ; len_second++ ; }// if not have cross ,return -1 if(pTmp1!=pTmp2){//if not cross return -1 ; }//compare length of the two link list and difference of two link list length,//and decide which list should move first int b_first_long=len_first>len_second ; int diff=b_first_long?(len_first-len_second):(len_second-len_first) ;//the longer list should move diff steps if(b_first_long){ pTmp1= pFirst ; while(diff--){ pTmp1=pTmp1->next ; printf("%d+",diff) ; } pTmp2 = pSecond ; }else{ pTmp2=pSecond ; while(diff--){ pTmp2=pTmp2->next ; } pTmp1 = pFirst ; }//compute the last positon and the position = diff + last move int location=b_first_long?(len_first-len_second):(len_second-len_first) ; while(pTmp1!=pTmp2) { pTmp1=pTmp1->next ; pTmp2=pTmp2->next ; location++ ; } return location ;}void create_cross_linklist(struct _link_node* pFirst, struct _link_node *pSecond,int len1,int len2,int position){ assert(pFirst!=NULL&&pSecond!=NULL) ; struct _link_node *pTmp1 = pFirst ; struct _link_node *pTmp2 = pSecond ; int cnt = 0; if(len1>len2){ assert((len2+position)<len1) ; while(cnt<len2){ pTmp1 = pTmp1->next ; pTmp2 = pTmp2->next ; cnt++ ; } cnt=0; while(cnt<position){ pTmp1=pTmp1->next ; cnt++ ; } pTmp2->next = pTmp1 ; }else{ assert((len1+position)<len2) ; while(cnt<len1){ pTmp1 = pTmp1->next ; pTmp2 = pTmp2->next ; cnt++ ; } cnt=0 ; while(cnt<position){ pTmp2 = pTmp2->next ; cnt++ ; } pTmp1->next = pTmp2 ; }}int main(){ int array[]={1,2,3,4,5,6,7,8,9,10,11,12,13,24} ; int array1[]={2,3,4,6,1,3} ; int len = sizeof(array)/sizeof(array[0]) ; int len1 = sizeof(array1)/sizeof(array1[0]) ; struct _link_node *pRoot1 = create_linklist(array,len) ; struct _link_node *pRoot2 = create_linklist(array1,len1) ; create_cross_linklist(pRoot1,pRoot2,len,len1,2) ; printf("find first cross_node begin............\n") ; printf("len=%d,len1=%d\n",len,len1) ; int location = find_first_cross_node(pRoot1,pRoot2) ; printf("first cross node at %d position\n",location) ; printf("find first cross_node end............\n\n") ; printf("binary search bound begin..........\n") ; printf("location=%d\n",binary_search1(array,0,len-1,24)) ; printf("upperbound=%d\n",binary_find_upper_bound(array,0,len-1,9)) ; printf("lowerbound=%d\n",binary_find_lower_bound(array,0,len-1,9)) ; printf("binary search bound end..........\n\n") ; printf("find reciprocal n node begin..........\n") ; struct _link_node *pRoot=create_linklist(array,len) ; struct _link_node *pTmp=get_reverse_n(pRoot,3) ; printf("data=%d\n",pTmp->data) ; printf("find reciprocal n node end..........\n") ;}
- 几道简单的面试题
- 几道熟悉的面试题
- 几道基础的面试题
- 几道AMAZON的面试题
- 几道嵌入式的面试题
- 分享几道奇怪的面试题
- 几道有趣的面试题
- 几道有意思的面试题
- 几道有意思的智力面试题
- 几道AMAZON的面试题
- 几道关于cocos2dx的面试题
- 几道关于cocos2dx的面试题
- 几道坑人的php面试题
- 简单的面试题
- 几道英文面试题
- 几道微软面试题
- 几道SQL面试题
- 几道嵌入式面试题
- 西安建委暂停中铁十八局等3家企业投标资格-西安-中铁十八局-招标
- 一张网页平均大小
- 把交换机变为根桥
- poj 3648 wedding
- JQuery中pageX與offset().top區別
- 几道简单的面试题
- C/C++中#和##在宏中的用法
- android 语音识别接口
- 宏和枚举有什么区别,定义数组时使用枚举和使用宏的区别
- 常量数字 被分配的位置
- 使用google analytics(分析)监测百度竞价关键词效果(网址构建工具)
- 推荐一本网络科学入门书
- ZTE MF880|ZTE MF880 Unlocked dongle|ZTE MF880 4G LTE|MF880 mobile broadband usb stick
- 有关Des加密,与base64加密技术