雅虎三道面试题

来源:互联网 发布:js点击显示隐藏div 编辑:程序博客网 时间:2024/05/17 22:51
雅虎三道面试题

1. 编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列。
解:
#include "stdafx.h"  #include <iostream>  using namespace std;  /************************************************************************/  /* 函数功能:把十进制数(long型)分别以二进制                             */  /************************************************************************/  void LongTo2(long n)  {      if(0 == n)          return;      else      {          LongTo2(n/2);          cout<<n%2;      }  }  /************************************************************************/  /* 函数功能:把十进制数(long型)分别以16进制                             */  /************************************************************************/  const char arr[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',                        'A', 'B', 'C', 'D', 'E', 'F'};  void LongTo16(long n)  {      if(0 == n)          return;      else      {          LongTo16(n/16);          cout<<arr[n%16];      }  }  int main()  {      LongTo2(56);      cout<<endl;      LongTo16(256);      cout<<endl;  }  

2. 编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"。
#include "stdafx.h"  #include <iostream>  using namespace std;  /************************************************************************/  /* 函数功能:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大              子串为"cad"*/  /************************************************************************/  void GetMaxCommonSubString(const char *str1, const char *str2, char* &subString)  {      int length1 = strlen(str1);      int length2 = strlen(str2);      int max = 0; //存储最大值      int start = 0;//最大公共字串在str1中开始的位置      for (int i=0; i<length1; i++)      {          for (int j=0; j<length2; j++)          {              int temp1 = i; //每次查找的开始位置              int temp2 = j;              int number = 0; //统计个数              while ((str1[temp1] == str2[temp2]) && (temp2 < length2) && (temp1 < length1)) //开始找公共字串              {                  number++;                  temp1++;                  temp2++;              }              if (number > max) //判断是否是最大的              {                  max = number;                  start = i;              }          }      }      strncpy(subString, str1 + start, max); //拷贝到subString中  }  int main()  {      const char* str1 = "abccade";      const char* str2 = "dgcadde";      int length = (strlen(str1) <= strlen(str2) ? strlen(str1) : strlen(str2));      char *str = new char[length];      memset(str, '/0', length+1);      GetMaxCommonSubString(str1, str2, str);      cout<<str<<endl;  }  


3. 有双向循环链表节点定义为:
struct node
{
    int data; 
    struct node *front,*next'
};
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的节点删除.

解:
struct Node{   int data;  struct Node *front,*next;  Node( int value ): data( value ), front( NULL ), next( NULL ) { };  void SetPointer( Node *pPre, Node *pNext ) { front = pPre; next = pNext; };};//如果成功删除返回真。否则,返回假。bool DeleteValue( Node *&pHead, int target ){if( pHead == NULL ) return false;//至少有两个元素bool flag = false;Node* ph = pHead;while( ph->next != pHead  ){Node *pPre = ph->front;Node *pNext = ph->next;if( ph->data == target ){//如果删除的是第一个元素if( ph == pHead ) pHead = ph->next;pPre->next = pNext;pNext->front = pPre;Node *tmp = ph;delete tmp;//设置删除标记flag = true;}ph = pNext;}//只有一个元素或最后一个元素if( ph->next == pHead ){if( ph->data == target ){//如果要删除的是最后一个元素if( ph->front != ph ){Node *pPre = ph->front;Node *pNext = ph->next;pPre->next = pNext;pNext->front = pPre;Node *tmp = ph;delete tmp;}else{delete pHead;pHead = NULL;}flag = true;}}return flag;}void DeleteSame( Node *&pHeadA, Node *&pHeadB ){if( pHeadA != NULL && pHeadB != NULL ){Node *pa = pHeadA;while( pa->next != pHeadA ){//如果B中含有pa->data,并且已经删除if( DeleteValue( pHeadB, pa->data ) ){//在A中删除pa->dataNode *tmp = pa->next;DeleteValue( pHeadA, pa->data );pa = tmp;}elsepa = pa->next;}//只有一个元素或最后一个元素if( DeleteValue( pHeadB, pa->data ) ){DeleteValue( pHeadA, pa->data );}}}


原创粉丝点击