今日刷题又开始了
一、寻找两个正序数组的中位数
题目链接: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
提示:文章来源:https://uudwc.com/A/59aXY
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;
}
else
return 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文章来源地址https://uudwc.com/A/59aXY
代码(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;
}