👉替换空格👈
请实现一个函数,把字符串 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; }
👉总结👈
以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家啦!💖💝❣️