力扣刷题(2)

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

寻找两个正序数组的中位数-力扣
在这里插入图片描述
思路:

  1. 合并两个正序数组
  2. 找中位数
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int arr[nums1Size + nums2Size];
    int n1 = 0, n2 = 0;
    int m = 0;
    int q;
    //合并两个正序数组
    while (n1 < nums1Size || n2 < nums2Size) 
    {
         if (n1 == nums1Size) 
        {
           q = nums2[n2++];
        } 
        else if (n2 == nums2Size) 
        {
            q = nums1[n1++];
        } 
        else if (nums1[n1] < nums2[n2]) 
        {
            q = nums1[n1++];
        } 
        else 
        {
            q = nums2[n2++];
        }
        arr[n1 + n2 - 1] = q;
    }
    //寻找中位数
    m = nums1Size + nums2Size;
    if(m == 1) 
        return arr[m-1];
    else
    {
        if(m%2 == 0)
        {
            return (arr[m/2] + arr[m/2-1])/2.0;
        }
        else 
        {
            return arr[m/2];
        }
    }
}

在这里插入图片描述

最长回文字符串

最长回文字符串-力扣

在这里插入图片描述
思路来源:Penn

  1. 遍历字符串
  2. 对于每个字母,向两侧扩散,判断是否回文子串
  3. 若为回文子串,保存最长的子串信息
  4. 子串长度为奇数或偶数,需分别判断
void Find(char* str,int n,int left,int right,int* start,int* len)
{
    while(left >=0 && right < n && str[left] == str[right])
    {
        left--;
        right++;
    }
    if(right - left -1 > *len)
    {
        *start=left+1;
        *len=right-left-1;
    }
}

char* longestPalindrome(char* s) {
    int n=strlen(s);//字符串长度
    int start=0;//开始位置
    int len=0;//子串长度
    for(int i=0;i<n;i++)//奇数长度回文子串
    {
        Find(s,n,i-1,i+1,&start,&len);
    }
    for(int i=0;i<n;i++)//偶数长度回文子串
    {
        Find(s,n,i,i+1,&start,&len);
    }
    s[start+len]='\0';//原地修改返回值
    return s+start;
}

Z字形变换

Z字形变换-力扣
在这里插入图片描述

char* convert(char* s, int numRows) {
    int n=strlen(s);
    int r=numRows;
    if(r == 1 || r >= n)
    {
        return s;
    }
    int t=2*r-2;//周期
    char* str=(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)//每个周期的起始下标
        {
            str[pos++]=s[i+j];//这个周期的第一个字符
            if(i > 0 && r-1 > i && j+t-i < n)
            {
                str[pos++]=s[j+t-i];//这个周期之后的字符
            }
        }
    }
    str[pos]='\0';
    return str;
}

在这里插入图片描述

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值