寻找两个正序数组的中位数
寻找两个正序数组的中位数-力扣
思路:
- 合并两个正序数组
- 找中位数
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;
}