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


    今日刷题又开始了


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

    题目链接: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];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    二、最长回文子串

    题目链接: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;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    三、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;
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    评估APP网页小程序代码UI开发H5估价师怎么评估开发精确研发价格?
    Linux C/C++实现时间戳转换工具
    2311rust,到50版本更新
    程序猿生成二维码的三种方法(在线接口+在线网站+本地程序)
    [附源码]Python计算机毕业设计Django二次元信息分享平台的设计及实现
    Unity SRP 管线【第二讲:Draw Call】
    上市公司退市的条件是什么
    前后端传输加密代码-java
    移动通信网络规划-容量评估和资源利用率评价
    pr视频剪辑素材,免费下载
  • 原文地址:https://blog.csdn.net/weixin_62529383/article/details/133030943