寻找两个正序数组的中位数
寻找两个正序数组的中位数-力扣
思路:
- 合并两个正序数组
- 找中位数
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
- 遍历字符串
- 对于每个字母,向两侧扩散,判断是否回文子串
- 若为回文子串,保存最长的子串信息
- 子串长度为奇数或偶数,需分别判断
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;
}