面试题整理

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++)!="")
      ;
      return ret;  
}

注意,检查指针是否为空; 返回目的指针;源字符串的""要拷贝。

7、struct(int a,char b,long c)的sizeof结果是多少? 32位机器和64位机器下的情况。

32位机器时候是 12, 64位机器时候是16。

当结构体内的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位,也就是说结构体的长度一定是最长的数据元素的整数倍。

原文地址:https://www.cnblogs.com/cxy0213/p/3721473.html