文章目录
- 一、剑指 Offer 67. 把字符串转换成整数
- 二、Leetcode 138. 复制带随机指针的链表
一、剑指 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;
}