力扣刷题:寻找两个正序数组的中位数、最长回文子串

今日刷题又开始了


一、寻找两个正序数组的中位数

题目链接: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;
    }
    else
        return nums[num/2];
}

二、最长回文子串

题目链接:https://leetcode.cn/problems/longest-palindromic-substring/

给你一个字符串 s,找到 s 中最长的回文子串。

扫描二维码关注公众号,回复: 16909674 查看本文章

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 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;
}



猜你喜欢

转载自blog.csdn.net/weixin_62529383/article/details/133030943