笔试编程题(一)

来源:互联网 发布:卡佩拉详细数据 编辑:程序博客网 时间:2024/06/04 19:10

1、写一个函数,它的原型是int continumax(char *outputstr,char *intputstr)。功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,同时把这个最长数字串赋给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值是123456789.

答:

int continumax(char *outputstr,char *intputstr)

{

  int i = 0;

  int j = 0;

  int m = 0;

  int len = 0;

  int max = 0;

  for(i = 0; intputstr[i] != '\0' ; i++)

  {

while(intputstr[i] >= '0' && intputstr[i] <= '9')

{

len++;

i++;

}

if(len > max)

{

max = len;

for(j = i - len ; intputstr[j] != '\0' ; j++ )

{

outputstr[m] = intputstr[j];

m++;

}

outputstr[m] = '\0';

}

len = 0;

m = 0;

  }

 return max;

}


2、通过编程,实现atof函数。

atof函数原型:double atof(const char *nptr);

nptr是字符串的指针;

功能:把字符串转换成浮点数的函数。


答:

double myatof(const char *nptr)

{

double temp = 10; //小数位相除

double ans = 0;  //返回的值

bool ispnum = true; //判断是否为正数

if( nptr == NULL)

{ return 0.0;}

while(*nptr == ' ' )

{ nptr++;}

if( *nptr  == '-')

{ ispnum = false;

 nptr++;

}

else if(*nptr == '+')

{

 nptr++;

}

while(*nptr != \0')

{

  if(*nptr == '.')

 {

  nptr++;

break;

 }

 ans = ans * 10 + (*nptr - '0');

 nptr++;

}

while(*nptr != '\0' )

{

ans = ans + (*nptr - '\0')/temp;

temp*=10;

nptr++;

}

if( ispnum)

{ return ans;}

else

{return ans*(-1);}

}


3、输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:

struct ListNode{

int m_nKey;

ListNode* m_pNext;

};


答:

方法一:遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前结点元素的指针反转后,利用已经存储的指针往后面继续遍历。

源代码:

void reverse(ListNode ** head)

{

if(head == NULL)

return;

ListNode *pre, *cur , *ne; //前一个结点指针、当前结点指针、后一个结点指针

pre = head;

cur = head->m_pNext;

while(cur)                                  // 指针反转

{

ne = cur->m_pNext;

cur->m_pNext = pre;

pre = cur;

cur = ne;

}

head->m_pNext = NULL;

head = pre;

}


方法二:

递归思想。基本思想是在反转当前结点之前先调用递归函数反转后续结点。

但是!这个方法有一个缺点:在反转后的最后一个结点会形成一个环(反转后的最后一个结点指针指向的是倒数第二个结点),所以必须将函数的返回的结点的next域(指针域)置为NULL,因为要改变head指针,所以用引用。(函数中用二级指针**)

源代码:

ListNode *reverse(ListNode *p , ListNode ** head)

{

if( p == NULL || p -> m_pNext == NULL)

{

head = p;

return p;

}

else

{

ListNode *tmp = reverse(p->m_pNext, head);

tmp->m_pNext = p;

return p;

}

}

ps: 这个函数还未将反转后的最后一个结点指向NULL,此时反转后的最后一个结点指向反转后的倒数第二个结点,倒数第二个指向倒数第一个。。。此时需要将反转后的最后一个结点指向NULL,即之前说的断开这个小环。

原创粉丝点击