打卡ARTS-3

每周完成一个ARTS:

Algorithm:每周至少做一个 leetcode 的算法题

Review:阅读并点评至少一篇英文技术文章

Tip:学习至少一个技术技巧

Share :分享一篇有观点和思考的技术文章;

Algorithm:

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231,  231 − 1]。如果数值超过这个范围,qing返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

输入: "42"
输出: 42

示例 2:

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

示例 5:

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

int getnumberbuf(char* dst,char* src, int dstlen){
    int len = 0;
    int flag = 0;
    int srclen = strlen(src);
    while(len <= dstlen && srclen)
    {
        switch(*src){
            case '0':
                if(flag == 0){
                    
                    len++;
                    break;
                }
            case '1':case '2':case '3':case '4':case '5':
                case '6':case '7':case '8':case '9':
                *dst = *src;
                dst++;
                len++;
                flag = 1;
                break;
            case '-':
                if(len == 0){  
                    *dst = *src;
                    dst++;
                    len++;
                   break;
                }
                return 1;
                break;
            case '+':
                if(len == 0){  
                    //*dst = *src;
                    //dst++;
                    len++;
                   break;
                }
                return 1;
                break;
            case ' ':
                if(len > 0){
                    return 1;
                }
                break;
            default:
                return 1;
                break;
        }
        src++;
        srclen--;
    }
    return 0;
}

static int64_t decimal_list[11] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000, 10000000000};

int convertAtoi(char *numberstr){
    int nlen = strlen(numberstr);
    int charset = 1;
    int64_t result = 0;
    
    if(nlen<=0){
        return 0;
    }
    
    if(*numberstr == '-'){
        charset = -1;
        numberstr++;
        nlen--;
    }
    
    if(nlen > 10 && charset == 1 ){
        return 2147483647;
    }else if(nlen > 10 && charset == -1){
        return -2147483648;
    }
    
    while(nlen > 0){
        //int a = pow(10, nlen -1);
        //printf("%d - %d \n", nlen , decimal_list[nlen - 1]);
        //printf("%d - %d \n",  nlen, a);
        result += (*numberstr - '0') * decimal_list[nlen - 1];
        //result += (*numberstr - '0') * pow(10, nlen - 1);
        nlen--;
        numberstr++;
    }
    
    if(charset * result >= 2147483648 ){
        result = 2147483647;
    }else if(charset * result <= -2147483648){
        result = -2147483648;
    }else
    {
        result = charset * result;
    }
    return result;
}

int myAtoi(char* str) {
    char numbuf[1024]="";
    getnumberbuf(numbuf, str, 1024);
 
    return convertAtoi(numbuf);
    
}

心得:将pow函数换为静态列表性能提升一倍(领扣数据);使用静态列表领扣执行时间12ms,跑完1000个测试用例,;

注意问题:int类型数组与64位数进行乘法计算时会出现问题,不清楚具体原因;待解;高手可联系我,一起测试下;

Review:

If I were to invent a programming languagefor the 21st century

新语言应该充分利用便宜的东西,来节约昂贵的东西;

Tips:

对NTP或DNS放大攻击是利用UDP伪造实现的,通过发送小的数据包来触发服务器回复很长的数据包,通过伪造源IP的方式来导致被攻击IP收到大量的响应数据包;NTP服务和DNS服务都存在类似的缺陷:

解决方法:设定单IP的访问频率,强制特殊字段TXT,MX等使用TCP访问,只对可信区域的IP做出应答等;

Share:

同样是DNS,DNS OVER HTTPS该方案由IETF支持,其规范文档以 RFC 8484 的名义发布;

https://en.wikipedia.org/wiki/DNS_over_HTTPS

https://zh.wikipedia.org/wiki/DNS_over_HTTPS

你可能感兴趣的:(打卡)