给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
从中学知识知道,如果需要求一组数字的中位数,那么先要从小到大排列这些数字。接着,如果总共有奇数个数字,那么直接取中间的,如果有偶数个数字,那么取中间与中间后面一个数字的平均数。
所以,第一步先将数组合并。合并两个数组的方式非常多,最简洁的就是三点运算符:
let result = [...nums1,...nums2]
接着,从小到大排列也很简单,原生 JS
就提供了一个排列元素的方法:
result = result.sort((a,b) => a-b)
然后,考虑问题的一个良好习惯就是考虑特殊的情况。所以,先想想有没有什么特殊的情况。比如,数组为空,或者数组只有一个元素。所以需要抽取这两种情况来处理。
if(result.length === 0) return null
if(result.length === 1) return result[0]
最后,就是将上面求中位数的思路表达出来,总数是奇数则直接取中间的,偶数则取中间与后面一位的平均数。
let target = parseInt((result.length / 2))
if(result.length % 2 !== 0){
return result[target]
}else{
return ((result[target] + result[target-1]) / 2)
}
var findMedianSortedArrays = function(nums1, nums2) {
let result = [...nums1,...nums2]
result = result.sort((a,b) => a-b)
if(result.length === 0) return null
if(result.length === 1) return result[0]
let target = parseInt((result.length / 2))
if(result.length % 2 !== 0){
return result[target]
}else{
return ((result[target] + result[target-1])/2)
}
};
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
【示例】
输入: [“flower”,“flow”,“flight”]
输出: “fl”
写一个函数用于比较两个字符串的字符序列,一旦出现不同的字符,则返回字符索引。接着,逐一比较数组中的每对字符串,得到多个索引值,分别将这些索引值存起来,最后求这组值的最小值就是最长的公共前缀。
var longestCommonPrefix = function(strs) {
if(!strs.length){
return ""
}
let arr = []
for(let i=0;i<strs.length;i++){
for(let j=i+1;j<strs.length;j++){
arr.push(foo(strs[i],strs[j]))
}
}
let index = Math.min(...arr)
function foo(a,b){
if(a === b){
return a.length
}
let target_length = Math.max(a.length,b.length)
for(let i=0;i<target_length;i++){
if(a[i] !== b[i]){
return i
}
}
}
return strs[0].slice(0,index)
};