1、如何将a、b的值交换,并且不使用任何中间变量?
a=a+b;
a=a-b;
b=a-b;
这样做的话,假如a和b都比较大,a=a+b会越界。可以下面这样的方案
a=a^b;
b=a^b;
a=a^b
2、怎样知道一个链表里是否有环的存在,以及确定环的位置 如何确定两个链表是否有相同的部分?
设置两个快慢指针,一个fast,一个slow,快的指针每次移动两步,慢的指针移动一步,如果最终相遇则是有环存在,不然fast指针会最先遇到null。
bool ls(slist *head) { slist *fast = head; slist *slow= head; while(fast && fast->next) { slow =slow->next; fast = fast->next->next; if (fast=slow) break; } return !(fast ==Null ||fast->next=Null) }
如何找到环的位置?
第一种情况:当这个链表是一个完整的环,想象成一个圆,fast和solw相遇的地点应该就是终点。
第二种情况:这个链表是局部有环,那么slow在到达终点之前就被追上了,此时fast已经在环内循环了n次。假设slow走了s步,那么fast就走了2s步。设相遇的地点离环的入口是x步,环的长度是r步,非环部分是a步,那么就有如下过程:
2s = s +nr
s = a+x
则 a+x = nr
整个链长度为L的话, r = L-a
a+x=n(L-a) ; a=(nL-x)/(n+1)
判断两个链表有相交,可以将其中一个链表首尾相连成一个环,去判断另外一个链表是否存在环? 如果存在,则相交;不存在,则不相交。
3、 一个长方形,挖去一个圆。在只给出这个圆的圆心,但不允许知道这个圆大小的情况下,如何把剩下的面积分成两半?
分别沿两条对角线对折得到长方形中心,然后沿着长方形中心和圆心的直线再对折一次,这一条折线刚好就可以把剩下的面积分成两半。
4、如何将一个十进制数转换成八进制?
定义一个栈,再将十进制数逐次除以基数8取余,在转换过程中,由低到高依次得到r进制数中的每一位数字,存入栈中,再依次出栈即得所要的8进制数。
5、字符串的反转
例如:链表为1、2、3、4、5、6;反转后为6、5、4、3、2、1。
九度上面有原题,http://ac.jobdu.com/problem.php?pid=1518 下面这段代码自己运行木有问题,但是提交上去总是wrong answer。 估计是什么地方没有考虑周全。
http://my.oschina.net/u/1011659/blog/216840 他的代码是accepted。
#include <iostream> using namespace std; struct List { int data; List *next; }; List * Creat() { List *p =NULL; List *q =NULL; List *head = NULL; int n; cin>>n; if(n<=0) cout<<"NULL"<<endl; else{ while(n>0) { p= new List; cin>>p->data; p->next=NULL; if (head==NULL) head=p; else q->next=p; q= p; n--; } } return head; } void DisPlay(List *head) { while(head!=NULL) { cout<<head->data<<" "; head=head->next; } //cout<<head->data<<endl; } List* ReverseList(List* pHead) { if (pHead==NULL ) { return 0; } else { List *p; List *q; List *r; p = pHead; q = pHead->next; pHead->next = NULL; while(q) { r = q->next; q->next = p; p = q; q = r; } pHead = p; return pHead; } } int main() { List *pHead; List *q; pHead=Creat(); q=ReverseList(pHead); DisPlay(q); system("pause"); return 0; }
6、strcpy的实现
char *strcpy(char *dst, const char *src) { assert(dst!=NULL); assert(src!=NULL); char *ret = dst; while((*dst++ = *src++)!="