现在的位置: 首页 > 综合 > 正文

几道笔试(面试)题

2017年08月05日 ⁄ 综合 ⁄ 共 5415字 ⁄ 字号 评论关闭

其中的大部分答案都是自己整理,难免有出错的地方请大家批评指正!!

1.计算一个字节中1的个数,例如000010011的个数为2

#include<iostream>
using namespace std;

int CalculateOne(char x)
{
 int count=0;
 while(x)
 {
  count++;
  x=x&(x-1);
 }
 return count;
}
 void main()
 {
 char number=9;
 int n;//统计1的个数
 n=CalculateOne(number);
 cout<<n<<endl;

 }

 

2.编写一个类,要求该类不能被继承,且只能实例化三次

#include<iostream>
using namespace std;
class FinalClass1
{
public :
   static int count ;//实例化次数
      static FinalClass1* GetInstance()
      {
        if(count<=0)
                return NULL;
            count--;
            return new FinalClass1;
      }
      static void setCount(int n)
      {
          count  = n;
       }
      static void DeleteInstance( FinalClass1* pInstance)
      {
            delete pInstance;
            pInstance = 0;
      }
 
private :
      FinalClass1() {}
      ~FinalClass1() {}
};

int FinalClass1::count=0;
void main()
{
 
    FinalClass1::setCount(3);
    FinalClass1 *f1 = FinalClass1::GetInstance();
    FinalClass1 *f2 = FinalClass1::GetInstance();
    FinalClass1 *f3 = FinalClass1::GetInstance();
    if (f3==NULL)
    {
        printf("f3 NULL\n");
    }else{
        printf("f3 Not NULL\n");

   }

    FinalClass1 *f4 = FinalClass1::GetInstance();
    if (f4==NULL)
    {
        printf("f4 NULL\n");
    }
    FinalClass1 *f5 = FinalClass1::GetInstance();
    if (f5==NULL)
    {
        printf("f5 NULL\n");
    }
}

 3.字符串的逆序

#include<iostream>
using namespace std;
void Reverse(char* s)
{
    char* p = s ;
 int i=0;
    while(*p!='\0')
        {p++ ;
  i++; 
 }
 p--;
 while(i--)
 cout<<*(p--);
}
void main()
{
 char* src="abcdef";
 Reverse(src);
}

4.字符串函数的实现

1strcpy的实现

#include<iostream>
using namespace std;

char*mystrcpy(char*dest,const char*src)
{
 if((dest!=NULL)&&(src!=NULL))
 {
 char *ret=dest;
 while((*dest++=*src++)!='\0');
 return ret;
 }
 else
 cout<<"输入错误"<<endl;
}
int main()
{
 char* str1=(char*)malloc(10);
 char* str2="abcd";
 mystrcpy(str1,str2);
 cout<<str1<<endl;
}

2strncpy的实现

#include<iostream>
using namespace std;
char* mystrncpy(char* dest,const char* src,size_t n)
{
 char*rec=dest;
 if((dest!=NULL)&&(src!=NULL))
 {   while(n)
  {
   *dest++=*src++;
   n--;
 }
 *dest='\0';
 return rec;
 }
 else
  cout<<"出现错误!"<<endl;
}
int main()
{
 char* str1=(char*)malloc(10);
 char* str2="abcdefg";
 mystrncpy(str1,str2,2);
 cout<<str1<<endl;
}

(3)strcat的实现

#include<iostream>
using namespace std;
char* mystrcat(char*dest,const char*src)
{
 char *rec=dest;
  while(*dest)
   dest++;
  while(*dest++=*src++);
 return rec;
}
void main()
{
 char *src1="ab";
 char *src2="cdef";
 mystrcat(src1,src2);
 cout<<*src1<<endl;
}

(4)strcmp

#include<iostream>
using namespace std;
int mystrcmp(const char*dest,const char*src)
{
 int len1=strlen(dest);
 int len2=strlen(src);
 while((*dest!='\0')&&(*src!='\0')&&(*dest==*src))
 {
  dest++;
  src++;
 }
 return (*dest-*src);
}
void main()
{
 char *src1="ab";
 char *src2="a";
 int n=mystrcmp(src1,src2);
 cout<<n<<endl;
}

5.String类的实现(构造函数,析构函数,拷贝构造函数,赋值函数的实现等)

 class String

  {

  public:

  String(const char *str = NULL); //
通用构造函数

  String(const String &another); //
拷贝构造函数

  ~ String(); //
析构函数

  String & operater =(const String &rhs); //赋值函数

  private:

  char *m_data; //
用于保存字符串

  };

 

构造函数的实现:
String::Stringconst char*str=NULL
{
ifstr==NULL
{ m_data=new char[1];
 m_data='\0';
}
else
{
 m_data=new char[strlen(str)+1];
 strcpy(m_data,str);
}

}

析构函数的实现:

String::~String()
{
 delete []m_data;

}

拷贝构造函数的实现

String::String(const String &another)

 m_data=new char[strlen(another.m_data)+1];
 strcpy(m_data,another.m_data);

}

赋值函数的实现

String&String::operater =(const String &rhs)
{
 if(this==&rths)//检查自赋值
 return *this;
 delete[] m_data;//删除原来的数据,新开一块内存
 m_data=new char[strlen(rhs.m_data)+1]
 strcpy(m_data,rths.m_data)
 return *this; 

6.括号匹配问题

 

#include<iostream>
using namespace std;

void main()
{
 char a[50],b[50];
 int i,j,flag;
 flag=i=j=0;
 gets(a);
 for(i=0;a[i]!='\0';i++)
 {
  if(a[i]=='(')
   b[j++]=1;
  if(a[i]==')')
   if(b[--j]!=1)
   {
   flag=1;
   break;
   
   }

  if(a[i]=='[')   
            b[j++]=2; 
        if(a[i]==']')   
            if(b[--j]!=2) 
            { 
                flag=1; 
                break; 
            } 
        if(a[i]=='{')  
            b[j++]=3; 
        if(a[i]=='}') 
            if(b[--j]!=3) 
            { 
                flag=1; 
                break; 
            } 
    }   
    if(flag==0)   
        printf("\nYES\n");         
    if(flag==1)   
        printf("\nNO\n");          
 }   

 

7.字符串倒置,单词顺序不变。例如:“i love you”倒置后“you love i”

 

#include<iostream>
using namespace std;

void strReverse(char *str)
{
 int i = 0;
 int j = 0;
 int begin;
 int end;
 char temp;

//...............第一步:整体倒置......................//

 j = strlen(str)-1;
 while (j>i)
 {
  temp = str[i];
  str[i] = str[j];
  str[j] = temp;
  i++;
  j--;
 }
 printf("after reversing wholly string = %s\n",str);

//...............第二步:按单词部分倒置......................//
 i = 0;
 while (str[i]!='\0')
 {
   begin = i;
  while((str[i]!='\0') && (str[i]!=' '))
   {
    i++;
   }
   end = i-1;
  while (begin<end)
  {
   temp = str[begin];
   str[begin] = str[end];
   str[end] = temp;
   begin++;
   end--;
  }
  i++;
 }
}
int main()
{
 
 char str[] = "i love you";
 printf("Original string = %s\n",str);
 strReverse(str);
 printf("reverse string = %s\n",str);
 return 0;
}

 

8.去除字符串多余的空格   例如:"  ab   c de  "转化为“ab  c de”

#include<iostream>
using namespace std;

void RemoveExtraSpace(char* str)

{
 bool flag=false;//表示还没有遇到空格

    int newstr=0; //新字符串

    if(str == NULL)

        return ;

    for(int i=0; str[i]; i++)

    {

        if(str[i] != ' ')

        {

            str[newstr++]=str[i];

            flag=true;

        }

        else if(flag){//遇到空格,将第一个空格存放到结果字符串中

            str[newstr++]=str[i];

            flag=false;

        }

        else //前面遇到的是空格,现在也是空格,不处理。这也直接将字符串前面的空格字符去掉了。

            continue;
    }

    //剔除字符结尾的空格,并加上结束符

    if(newstr>0 && str[newstr-1]==' ')

        str[newstr-1]='\0';

    else//newstr总是指向最后一个字符的后面

        str[newstr]='\0';

}

void main()
{
 char s[]="  ab   c de  ";
 RemoveExtraSpace(s);
 cout<<s<<endl;
}

抱歉!评论已关闭.