代码

请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句

#define Compare(a,b) ((a)-(b)) != abs((a)-(b)) ? b : a

 

有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?
答案参考:http://blog.sina.com.cn/s/blog_5dc7bbf80100v77b.html


//在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。
//例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int continumax(char *outputstr,const char *inputstr)
{
 int max = 1,len = 1;//记录连续数字串的长度
 char *p,*q,*m;//临时变量

 const int size = strlen(inputstr);
 char temp[100];
 p = (char*)inputstr;
 q = (char*)++inputstr;//记录字符串的下一个位置

 int i = 0;
 while(*p != '\0')
 {
  m = p;
  while(*p >= '0' && *p <= '9' && *p+1 == *q)
  {
   p++;
   q++;
   len++;//长度加1
  }

  if(len > max)
  {
   max = len;

   len = 1;
   i = 0;

   while(m <= p)
   {
    temp[i] = *m;
    i++;
    m++;
   }
  }
  p++;
  q++;
 }

 temp[i +1] = '\0';
 
 for(i = 0;temp[i] != '\0';i++)
 {
  *outputstr = temp[i];
  outputstr++;
 }
 
 *outputstr = '\0';
 
 return max;
}

int main()
{
 char* inputstr = "abcd12345ed12345678ss123456789";
 char* outputstr = (char*)malloc(strlen(inputstr) + 1);

 printf("%d:  最大连续数字串为:%s",continumax(outputstr,inputstr),outputstr);
 printf("\n");
 return 0;
}


//利用指针的方法,来对调显示字符串
#include<stdio.h>
#include<string.h>

int main()
{
 char str[] = "ABCDefg123";//这里需要用数组,如果使用指针,那么将一个字符串常量赋给一个字符串指针,那么这个指针为常量指针,里面值可以读,但不可以修改
                           //如果想使用指针,那么可以将一个字符串变量赋给一个字符串指针即可,这时还需要用到字符串数组,故可直接使用字符串数组,该数组
                           //也是按照地址进行寻址,故可修改里面的值。
 int len = strlen(str1);

 char *p,*q;
 p = str;
 q = str + len -1;

 while(p <= q)
 {
  char temp = *p;
  *p = *q;
  *q = temp;

  p++;
  q--;
 }
 printf("%s\n",str);
 return 0;
}
//有一个数组a[1000]存放0-1000;要求每隔两个数删掉一个数,到末尾时循环至开头继续进行
//求最后一个被删除的原始下标位置;
//现使用链表的形式进行操作

#include<stdio.h>
#include<stdlib.h>

typedef struct Node
{
 int data;
 struct Node* next;
};

Node* CreateNode(int n)
{
 Node* p;//定义一个节点
 Node* h = (Node*)malloc(sizeof(Node)) ;//定义链表的头结点
 
 h->data = 0;
 h->next = NULL;
 
 p = h;//用于进行循环
 for(int i = 1;i <= n;i++)
 {
  Node* temp = (Node*)malloc(sizeof(Node));
  temp->data = i;
  temp->next = NULL;
  
  p->next = temp;
  p = p->next;
 }

 return h;//返回链表头
}

int Del(Node* h)
{
 while(h->next->next->next != NULL)
 {
  Node* temp1 = h ;
  Node* temp2 = h->next;
  
  while(temp2 != NULL && temp2->next != NULL)
  {
   temp2->next = temp2->next->next;

   temp1 = temp2->next;
   if(temp1 == NULL)
    temp2 = temp1;
   else
    temp2 = temp1->next;
  }
 }

 return h->next->next->data;
}

void main()
{
 Node* h = CreateNode(13);

 int n = Del(h);

 printf("%d  \n",n);
}

 

//指出下列代码的错误
void test2()
{
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1[i] = 'a';
}
strcpy( string, str1 );
}
解答:对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;
str1不能在数组内结束:因为str1的存储为:{a,a,a,a,a,a,a,a,a,a},没有'\0'(字符串结束符),所以不能结束
strcpy( char *s1,char *s2)他的工作原理是,扫描s2指向的内存,逐个字符付到s1所指向的内存,直到碰到'\0',因为str1结尾没有'\0',所以具有不确定性


//重写strcmp函数
int strcmp(char* str1,char* str2)
{
       while(*str1 && *str2 ** *str1++ == *str2++);//控制循环的进行,直至遇到两个字符串不相等为止
       
        return (*str1 - *str2);
}

//子串的定位
char* FindSubstr(char* mainstr,char* substr)
{
       char*p,*q,*m;
       
       p = mainstr;
       q = substr;
       while(*p != '\0')
           {
                m = p;
                while(*q && *q == *m)

                   {
                        q++;    m++;

                   }

                if(*q)

                     return p;

                else

                   {
                        q = substr;
                        p++;

                   }
           }

}

虚函数和纯虚函数的作用和区别

虚函数为了重载和多态的需要,在基类中定义的,即便定义是空,所以子类中可以重写也可以不重写基类中的函数。

 

纯虚函数在基类中没有定义,必须在基类中加以实现。纯虚函数相当于接口,不能直接实例化,需要派生类来实现函数定义。

 

虚函数的定义:
       virtual a();哪怕是空实现

纯虚函数的定义:
       virtual a() = 0;需要后面等于0.

 

带有纯虚函数的类叫虚基类,这种基类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。这样的类叫做抽象类。

 

栈和堆的区别

栈在内存中分配的是一块连续的内存区域,可获得的区域较小;

堆在内存中分配的是一块不连续的内存区域,可获得较大的区域。

 

栈由系统自动分配,速度较快,但程序员是无法控制的;

堆是需要动态申请,一般速度比较慢,并且容易产生内存碎片,不过方便

 

栈所用的内存空间可以自动收回

堆所用的内存空间需要手工释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值