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++)!="