剑指 Offer 67. 把字符串转换成整数及复制带随机指针的链表


一、剑指 Offer 67. 把字符串转换成整数

题目是这样的
在这里插入图片描述

字符串转换为整数,是连续的数字字符转换,如果数字字符不连续,只转换最前面连续的那部分
其实这道题是这样的,如果一开始字符串就不是正负号或者数字字符或者空格字符,那么就返回0
如果一开始为空格,则将空格丢弃,直到不是空格字符为止,然后对其第一个非空字符判断 有三种情况
情况一:第一个非空字符既不是正负号,也不是数字字符,直接返回0.
情况二:第一个非空格字符为正负号字符,将其第一个非空字符的下标保存,然后再判断非空字符的下一个字符,如果这个字符不存在或者这个字符不是数字字符,直接返回0
情况三;第一个非空字符为数字字符,那么直接将其转换为整数,之后再转换下一个字符,看是否满足转换条件
在这里插入图片描述

int strToInt(char* str) {
    
    
    if (*str == '\0')
    {
    
    
        return 0;
    }

    int len = strlen(str);
    int i = 0;
    long long int number = 0;/*用于返回数据*/

    while (str[i] == ' ')
    {
    
    
        i++;
    }

    int j = i;//将第第一个非空字符的下标保存下来(主要是正负号比较)

    //第一种情况
    if (str[i] != '-' && str[i] != '+' && (str[i] < '0' || str[i]>'9'))//当第一个非空字符既不是数字字符也不是正负号,就是返回0
    {
    
    
        return 0;
    }

    //第二种情况,第一个非空格字符为正负号
    else if (str[j] == '+' || str[j] == '-')
    {
    
    
        if (i + 1 >= len)return 0;//第一个非空字符的下一个字符不存在直接返回0

        else if (i + 1 < len && (str[i + 1] < '0' || str[i + 1]>'9')) //下一个字符存在,但是不是数字也直接返回0
        {
    
    
            return 0;
        }

        //都不是那么第二个非空字符就是'0'~'9'之间的字符
        else {
    
    

            i++;//由于第一个非空字符为正负号,那么就要将第二个非空字符转换为数字,
            //所以i自增,让i指向第二个非空格字符

            while (i < len && str[i] >= '0' && str[i] <= '9')
            {
    
    
                
                number = number * 10 + (str[i] - '0'); //将数字字符转换成整数
                
                //第一个非空格字符为负号,表明转换成的整数是负数
                if (str[j] == '-')
                {
    
    
                    //每转换一位字符都要判断整数是否越界
                    //若是当前字符转换完成时已经发生整数越界,比32为机器下最小值还小,那么后续字符不必再转换,直接返回32位机器下的最小存储值
                    if (-number <= -2147483648)
                    {
    
    
                        return -2147483648;
                    }
                }

                //第一个非空字符为正号
                //判断是否超过32为机器下整数类型最大值
                if (number > 2147483647)
                {
    
    
                    return 2147483647;
                }

                i++;//最后没有返回在将其后面字符转换
            }

            //最后如果非空字符之后连续数字都转换完了,还达不到返回条件,此时再进行返回,但是还是要先判断转换而来的是整数还是负数
            if (str[j] == '-')
            {
    
    
                number = -number;
            }
            return number;
        }
    }

   // 最后就是,第一个非空字符就是数字字符
    else  //就是(str[j] >= '0' && str[j] <= '9')
    {
    
    

        while (i < len && str[i] >= '0' && str[i] <= '9')
        {
    
    
            number = number * 10 + (str[i] - '0');

            if (number >= 2147483647)
            {
    
    
                return 2147483647;
            }
            i++;
        }

        return number;
    }
   
}

二、Leetcode 138. 复制带随机指针的链表

在这里插入图片描述

最主要的思想就是开一个节点,插在原链表节点后面,且值为原节点的值,链表每个节点后面都插入一个节点,其实就是将原链表节点的值拷贝给新节点
在这里插入图片描述

struct Node* copyRandomList(struct Node* head) {
    
    
	struct Node*cur = head;
   
    //这个拷贝节点其实就相当于链表插入一个节点
    //插入操作
    while(cur)
    {
    
    
        struct Node*copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        struct Node*next = cur->next;
        copy->next = next;
        cur->next = copy;
        cur = next;
    }
    //链表从头开始拷贝random指针
    cur = head;
    while(cur)
    {
    
    
        struct Node*copy = cur->next;
        //如果原节点的random指针指向空,那么拷贝节点的random指针也指向空
        if(cur->random == NULL)
        {
    
    
            copy->random = NULL;
        }

        //原链表节点的random指针不为空,那么拷贝节点的random指针其原链表节点random->next指针,因为random指针可以找到其节点的随机地址,而这个随机地址的拷贝由随机地址的next指向,所以就是random->next;因为这拷贝要将值和random都拷贝过去
        else
        {
    
    
            copy->random = cur->random->next;
            
        }
        cur = copy->next;
    }


    //拷贝完成后,再将原链表恢复,然后将拷贝的各个节点链接起来
    //这样就达成目标
    //时间复杂度O(n)
    //空间复杂度O(1)
    struct Node*copyHead = NULL;
    struct Node*copyTail = NULL;
    cur = head;
    while(cur)
    {
    
    
        struct Node*copy = cur->next;
        struct Node*next = copy->next;
        if(copyHead == NULL)
        {
    
    
            copyHead = copyTail = copy;

        }

        else
        {
    
    
         copyTail->next = copy;
         copyTail = copyTail->next;
        }
        cur->next = next;
        cur = next;
    }

    return copyHead;
}

猜你喜欢

转载自blog.csdn.net/m0_67768006/article/details/130394281
今日推荐