zoukankan      html  css  js  c++  java
  • 面试题整理

    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。

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

  • 相关阅读:
    <Android 基础(二十六)> 渐变色圆角Button
    Java 中父类怎么调用子类的方法?
    <Android 基础(二十五)> Frame Animation
    Java基础知识点
    HTTP请求流程(二)----Telnet模拟HTTP请求
    telnet远程登录协议
    HTTP协议详解
    STM32 SPI接口的NSS引脚
    TCP/IP
    以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解
  • 原文地址:https://www.cnblogs.com/cxy0213/p/3721473.html
Copyright © 2011-2022 走看看