实习整理(十二)

来源:互联网 发布:大数据的技术原理 编辑:程序博客网 时间:2024/04/30 13:48

关于实习笔试,面试这部分感觉都写得差不多了,剩下一些零零碎碎的知识,还是继续写上吧。。。

关于字符串处理:

1、字符串反转reverse
2、字符串复制memcpy
3、内存复制memcpy
4、字符串长度strlen
5、字符串连接strcat
6、字符串比较strcmp
7、字符串转整数atoi  
8、字符串元音字符个数
9、字符串是否回文数


1、字符串反转
思想:遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环
这道题如果是我的话就会立马选择第一种解法,因为时间是有限制的
注意:
(1)一般不使用库函数,如strlen、strcpy 等。
(2)如果字符从是const char *str ,那么处理的时候先复制出来。
         char* tmp = new char[strlen(str) + 1];
         strcpy(tmp,str);
【解法1】:使用另外一个数组,进行逆向复制。空间浪费较多

char * reverse(string s1,char s2[])
{
    for(int i=0;i<s1.length();i++)
    {
        s2[s1.length()-1-i]=s1[i];//反向存储字符
    }
    return s2;
}

【解法2】:使用一个临时变量,对字符串首尾进行反转。耗费一个变量空间

char *reverse(char *str)
{
        char *start, *end;
        char temp;
        start = end = str;
        while(*end++ != '\0');
        end -= 2;

        while(start<end)
        {
                temp = *start;
                *start++ = *end;
                *end-- = temp;
        }

        return str;
}


【解法3】:不使用额外变量,直接对调。使用异或操作

char *reverse(char *str)
{
        char *start, *end;
        start = end = str;
        while(*end++ != '\0');
        end -= 2;

        while(start<end)
        {
                *end ^= *start;
                *start ^= *end;
                *end ^= *start;
                start++;
                end--;
        }

        return str;
}



2、字符串复制。不调用库函数,实现strcpy函数

#include <stdio.h>
#include <assert.h>
char *strcpy( char *dest, const char *src)
{
       assert( (dest != NULL) && (src != NULL));            //检查指针有效性
        char *destCopy = dest;                                             //保存目的字符串指针起点
        while((*dest++ = *src++) != '\0')     
                  ;                                                                             //字符串复制,包括'\0'
        return destCopy;                                                        //返回目的字符串
}


3、内存复制:memcpy

Linux实现:
void *memcpy( void *dest, const void *src, size_t count)
{
        char *d = dest;
        const char *s = src;
        while(count--)
                *d++ = *s++;
        return dest;
}

4、字符串求长度。strlen
【解法1】:利用while语句

#include <assert.h>
size_t strlen(const char *src)
{
        assert(src !=NULL);
        int len = 0;
        while(*src++ != '\0')
                len++;
        return len;
}

【解法2】:无变量版,递归

size_t strlen(const char *src)
{
        if (*src == '\0')
                return 0;
        else
                return (strlen(++src) + 1);
}

5、字符串连接 //这个程序会出现问题,dest内存不够

#include <assert.h>
char *strcat( char *dest, const char *src)
{
        assert( (dest != NULL) && (src != NULL));
        char *destCat = dest;
        while(*dest != '\0')
                dest++;
        while((*dest++ = *src++) != '\0');
        
        return destCat;
}
或者
char * strcat(char *s1,const char *s2)
{
    char *s3=new char[10];
    int len=0;//用于将指针退回到最开始的地方
    while(*s1!='\0')
    {
       *s3++=*s1++;
       len++;
    }
    while(*s2!='\0')
    {
        *s3++=*s2++;
       len++;
    }
    return s3-len+1;
}
PS:我觉得这个题目如果没有规定要用指针的话,可能用字符数组会更加适合

6、字符串比较

int strcmp( const char *src, const char *dst)
{
        assert( (src != NULL) && (dst != NULL));
        int ret = 0;
       while( !( ret = *(unsigned char *)src - *(unsigned char *)dst ) && *src && *dst )
                ++src,++dst;
        if(ret < 0)
                ret = -1;
        else if(ret > 0)
                ret = 1;
        return (ret);
}
或者
void strcmp(char *s1,char *s2)
{
    int result=0;
    while(*s1!='\0'&&*s2!='\0')
    {
        if((*s1-*s2)>0)
        {
            result=1;
            break;
        }
        else if((*s1-*s2)<0)
        {
            result=-1;
            break;
        }
        s1++;s2++;
    }
    if(*s1=='\0'&&*s2!='\0') result=-1;
    else if(*s2=='\0'&&*s1!='\0')result=1;
    cout<<result<<endl;
}


0 0