作者:@阿亮joy.
专栏:《阿亮爱刷题》
座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:
输入:
s = "We are happy."
输出:"We%20are%20happy."
限制:
- 0 <= s 的长度 <= 10000
思路:先统计出字符串 s 中的空格个数,然后根据该个数计算出新字符串的总长度,最后从后向前替换空格。
char* replaceSpace(char* s)
{
int len = strlen(s);
int spaceCount = 0;//统计空格的个数
int i = 0;
for(i = 0; i < len; i++)
{
if(s[i] == ' ')
{
spaceCount++;
}
}
int newLen = len + 2 * spaceCount;//字符串长度
char* ret = (char*)malloc(sizeof(char)*(newLen + 1));//newLen + 1是为了放'\0'
ret[newLen] = '\0';
int pos = newLen - 1;
//从后向前替换空格
for(i = len - 1; i >= 0; i--)
{
if(s[i] == ' ')
{
ret[pos--] = '0';
ret[pos--] = '2';
ret[pos--] = '%';
}
else
{
ret[pos--] = s[i];
}
}
return ret;
}
数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?
示例 1:
输入:
[3,0,1]
输出:2
示例 2:
输入:
[9,6,4,2,3,5,7,0,1]
输出:8
先求出 0 ~ n 的和 oldSum
,然后再利用 for
循环求出 nums
数组的总和 numsSum
,oldSum
和 numsSum
的差值就是消失的数字。
int missingNumber(int* nums, int numsSize)
{
int i = 0;
int numsSum = 0;
int oddSum = numsSize * (numsSize + 1) / 2;
for(i = 0; i < numsSize; i++)
{
numsSum += nums[i];
}
return oddSum - numsSum;
}
定义一个整型变量ret = 0
,利用for
循环将ret
和nums
数组中的异或,再将ret
和 0 ~ n 的数字异或,现在ret
就是消失的数字。因为除了消失的数字只异或了一次,其他数字都异或了两次。
int missingNumber(int* nums, int numsSize)
{
int i = 0;
int ret = 0;
for(i = 0; i < numsSize; i++)
{
ret ^= nums[i];
}
for(i = 0; i <= numsSize; i++)
{
ret ^= i;
}
return ret;
}
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2:
输入:
head = [2,1], x = 2
输出:[1,2]
提示:
- 链表中节点的数目在范围 [0, 200] 内
- -100 <= Node.val <= 100
- -200 <= x <= 200
思路:定义两个哨兵位 smallHead
和bigHead
,为了方便接下来的连接节点。再定义三个指针smallTail
、bigTail
和cur
,利用while
循环遍历链表。当cur->val < x
时,执行smallTail->next = cur和smallTail = cur
;否则,执行bigTail->next = cur和bigTail = cur
。循环结束后,将bigTail
指向NULL
,smallTail->next
执行bigHead->next
。最后,将结果返回就行了。
struct ListNode* partition(struct ListNode* head, int x)
{
if(head == NULL)
return NULL;
struct ListNode* smallHead = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* bigHead = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* smallTail = smallHead;
struct ListNode* bigTail = bigHead;
struct ListNode* cur = head;
while(cur)
{
if(cur->val < x)
{
smallTail->next = cur;
smallTail = cur;
}
else
{
bigTail->next = cur;
bigTail = cur;
}
cur = cur->next;
}
bigTail->next = NULL;
smallTail->next = bigHead->next;
struct ListNode* ret = smallHead->next;
free(smallHead);
free(bigHead);
return ret;
}
给你一个整数数组 nums,返回数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
题目数据保证数组 nums 之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。
请不要使用除法,且在 O(n) 时间复杂度内完成此题。
示例 1:
输入:
nums = [1,2,3,4]
输出:[24,12,8,6]
示例 2:
输入:
nums = [-1,1,0,-3,3]
输出:[0,0,9,0,0]
思路:定义left
和right
,利用一次for
循环进行乘积,将每个位置左边的数据和右边的数据乘积计算出来放到返回数组中,循环结束后将结果返回。
int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
int* result=(int*)malloc(sizeof(int)*numsSize);
int left=1,right=1;//left:从左边累乘,right:从右边累乘
for(int i=0;i<numsSize;i++)//最终每个元素其左右乘积进行相乘得出结果
{
result[i]=1;
}
for(int i=0;i<numsSize;i++)
{
result[i] *= left;//乘以其左边的乘积
left *= nums[i];//左边的数的乘积
result[numsSize-1-i] *= right;//乘以其左边的乘积
right *= nums[numsSize-1-i];//右边的数的乘积
}
*returnSize=numsSize;
return result;
}
以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家啦!❣️