今日刷题又开始了
一、寻找两个正序数组的中位数
题目链接:https://leetcode.cn/problems/median-of-two-sorted-arrays/
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
代码(C)
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){//首先需要合并数组,然后再找到中间的数字//合并数组int num = nums1Size + nums2Size;int nums[num];int index1 = 0;int index2 = 0;for(int i = 0;i < num;i++){if(index1 < nums1Size &&index2 < nums2Size){if(nums1[index1]<nums2[index2]){nums[i] = nums1[index1];index1++;}else{nums[i] = nums2[index2];index2++;}}else if(index1 >= nums1Size){nums[i] = nums2[index2];index2++;}else{nums[i] = nums1[index1];index1++;}}if(num%2 ==0){return (double)(nums[num/2-1]+nums[num/2])/2;}elsereturn nums[num/2];
}
二、最长回文子串
题目链接:https://leetcode.cn/problems/longest-palindromic-substring/
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
代码(C)
char * longestPalindrome(char * s){int N = strlen(s), start = 0, len = 0; // N 字符串长度, start 子串起始位置, len 子串长度for (int i = 0; i < N; i++) { // 奇数长度的回文子串int left = i - 1, right = i + 1;while (left >= 0 && right < N && s[left] == s[right]){left--; right++; // 以 i 为中心,向两侧延伸,直到不再满足回文} // left+1 ~ right-1 则为以i为中心的最大回文子串if (right - left - 1 > len) { // 若更长,则保存该子串信息start = left + 1;len = right - left - 1;}}for (int i = 0; i < N; i++) { // 偶数长度的回文子串int left = i, right = i + 1; // 以 i+0.5 为中心,向两侧延伸while (left >=0 && right < N && s[left] == s[right]) {left--, right++;}if (right - left - 1 > len) {start = left + 1;len = right - left - 1;}}s[start + len] = '\0'; // 原地修改返回return s + start;
}
三、N 字形变换
题目链接:https://leetcode.cn/problems/zigzag-conversion/
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
示例 2:
输入:s = “PAYPALISHIRING”, numRows = 4
输出:“PINALSIGYAHRPI”
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = “A”, numRows = 1
输出:“A”
提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 组成
1 <= numRows <= 1000
代码(C)
char * convert(char * s, int numRows){int n = strlen(s), r = numRows;if (r == 1 || r >= n) {return s;}int t = r * 2 - 2;char * ans = (char *)malloc(sizeof(char) * (n + 1));int pos = 0;for (int i = 0; i < r; ++i) { // 枚举矩阵的行for (int j = 0; j + i < n; j += t) { // 枚举每个周期的起始下标ans[pos++] = s[j + i]; // 当前周期的第一个字符if (0 < i && i < r - 1 && j + t - i < n) {ans[pos++] = s[j + t - i]; // 当前周期的第二个字符}}}ans[pos] = '\0';return ans;
}