面试复习-------算法与数据结构------实现库函数

库函数的实现

(1)字符串拷贝函数strcpy()

/***********************************
实现strcpy函数
输入:char* dest,char* src
输出:dest
***********************************/
char* strcpy(char* dest, char* src)
{
    if(dest == NULL || src == NULL)
        return NULL;

    char* tmp = dest;   //因为最后要返回目标首地址,所以dest是不能改变的
    while(*src != '\0'){
        *tmp = *src;
        tmp++;
        src++;
    }
    *tmp = '\0';
    return dest;
}
(2)指定数量的字符串拷贝函数strncpy()

/***********************************
实现strncpy函数
输入:char* dest,char* src,复制字符个数n
输出:dest
***********************************/
char* strncpy(char* dest, char* src, int n)
{
    if(dest == NULL || src == NULL || n <= 0)
        return NULL;

    char* tmp = dest;   //因为最后要返回目标首地址,所以dest是不能改变的
    while(n != 0){
        if(src!='\0'){
            *tmp = *src;
            tmp++;
            src++;
            n--;
        }else{
            *tmp = '\0';	//如果n大于源字符串的长度,需要补'\0'
            tmp++;
            n--;
        }
    }
    *tmp = '\0';
    return dest;
}
(3)字符串比较函数strcmp()

/***********************************
实现strcmp函数
输入:char* str1,char* str2
输出:int
    若两个字符串相等,则返回0;
    否则返回第一个不相等字符的差值
***********************************/
int strcmp(char* str1, char* str2)
{
    if(str1 == NULL && str2 == NULL)
        return 0;
    if(str1 == NULL && str2 != NULL)
        return -(int)(*str2);
    if(str1 != NULL && str2 == NULL)
        return (int)(*str1);
    while(*str1 == *str2 && *str1 != '\0' && *str2 != '\0'){
        str1++;
        str2++;
    }
    //相等则为'\0'-'\0' = 0;
    //不相等则为第一个不相等的字符之差
    return *str1 - *str2;
}
(4)字符串衔接函数strcat()

/***********************************
实现strcat函数
输入:char* dest,char* src
输出:dest
***********************************/
char* strcat(char* dest, char* src)
{
    if(dest == NULL )
        return src;
    if(src == NULL)
        return dest;
    char* tmp = dest;
    while(*tmp != '\0')
        tmp++;
    while(*src != '\0'){    //覆盖源字符串最后的'\0'
        *tmp = *src;
        tmp++;
        src++;
    }
    *tmp = '\0';        //最后需要添加'\0'

    return dest;
}
(5)字符串长度
/***********************************
实现strlen函数
输入:char* str
输出:int 长度
***********************************/
int strlen(char* str)
{
    if(str == NULL)
        return 0;
    int count = 0;
    while(*str != '\0'){
        count++;
        str++;
    }
    return count;   //不包括最后的'\0'
}
(6)atoi函数

重点在于:空指针判断、正负号检测、空串、非法字符、溢出

因为非法返回0,为了和值为0 的输入区分开,可以使用一个全局变量

//全局变量用来判断结果0是否为非法输入
bool validInput = false;

int atoi(char* str)
{
    //空指针或者是空串为非法输入
    if(str == NULL || !strcmp(str,"")){
        validInput = true;
        return 0;
    }
    //记录正负号
    bool minu = false;
    if(str[0] == '+')
        str++;
    else if(str[0] == '-'){
        str++;
        minu = true;
    }
    //只有一个正负号的时候,也是非法输入
    if(*str == '\0'){
        validInput = true;
        return 0;
    }

    long result = 0;    //用long保存int,这样更好判断溢出
    while(*str != '\0'){
        if( *str < '0' || *str >'9'){
            validInput = true;
            return 0;
        }
        result = result * 10 + (*str - '0');
        str++;
        if(( !minu && result > 0x7FFFFFFF) ||( minu && (-result) < 0x80000000)){
            validInput = true;
            return 0;
        }
    }
    if(minu){
        return -(int)result;
    }else
        return (int)result;
}

(7)pow函数

实现double Power(double base, int exponent);

需要考虑的问题:

-------exponent为负数的情况:取绝对值进行计算,最后去倒数即可

-------base为0,exponent为负数:设置全局变量同时返回0

-------效率:n为偶数:a^n = a^(n/2) * a^(n/2);n为奇数:a^n = a*a^((n-1)/2) * a^((n-1)/2);

bool invalid_input = false ;

//小数之间不能用==判断
bool equals(double num1, double num2)
{
    if(abs(num1-num2)<0.0000001)
        return true;
    else
        return false;
}
//优化效率
double powerCore(double base, int n)
{

    if(n == 1)
        return base;
    double res = powerCore(base, n>>1);
    res *= res;
    if( n%2 == 1)
        res *= base;
    return res;

}

double power(double base, int exponent)
{
    bool minu = false;
    if(equals(base, 0.0) && exponent < 0){
        invalid_input = true;
        return 0.0;
    }
    if(exponent == 0){
        return 1.0;
    }
    if(exponent < 0){
        exponent = -exponent;
        minu = true;
    }
    double result = 1.0;

    result = powerCore(base, exponent);

    if(minu == true)
        return 1.0 / result;
    else
        return result;

}


(8)求平方根函数(leetcode69

利用二分法查找

int mySqrt(int x) {
        if(x <= 0)return 0;
        int start = 0;
        int end = INT_MAX;
        
        while(start <= end){
            int mid = start + (end - start) / 2;
            if(mid == x / mid)return mid;
            else if(mid < x / mid && (mid+1) > x / (mid+1))return mid;
            else if(mid < x / mid )start = mid+1;
            else end = mid-1;
        }
        
}



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下 4载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
学校大创竞赛管理系统,学生上报项目内容,学院、教务处、评审专家评审。SpringBoot、SpringCloud、SpringSecurity、redis、Mysql、swagger、fastdfs、maven、vue、webpack.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值