习题练习05

tech2022-12-10  111

搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5 输出: 2

示例 2:

输入: [1,3,5,6], 2 输出: 1

示例 3:

输入: [1,3,5,6], 7 输出: 4

示例 4:

输入: [1,3,5,6], 0 输出: 0

/** * @param {number[]} nums * @param {number} target * @return {number} */ var searchInsert = function(nums, target) { if(nums[0] > target) return 0 if(nums[nums.length - 1] < target) return nums.length for(let i = 0; i < nums.length; i++) { if(nums[i] < target && nums[i + 1] > target) { return i + 1 } if(nums[i] === target) { return i } } };

外观数列

给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

注意:整数序列中的每一项将表示为一个字符串。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

1 11 21 1211 111221

第一项是数字 1

描述前一项,这个数是 1 即 “一个 1 ”,记作 11

描述前一项,这个数是 11 即 “两个 1 ” ,记作 21

描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211

描述前一项,这个数是 1211 即 “一个 1 一个 2 两个 1 ” ,记作 111221

示例 1:

输入: 1 输出: “1” 解释:这是一个基本样例。

示例 2:

输入: 4 输出: “1211”

解释:

当 n = 3 时,序列是 “21”,其中我们有 “2” 和 “1” 两组,“2” 可以读作 “12”,也就是出现频次 = 1 而 值 = 2;类似 “1” 可以读作 “11”。所以答案是 “12” 和 “11” 组合在一起,也就是 “1211”。

/** * @param {number} n * @return {string} */ var countAndSay = function(n) { if(n==1){ return n.toString() } var tempArr = countAndSay(n-1).match(/(\d)\1*/g) // 该正则进行相同分组,调用match方法得出接下来用的数组 var result = "" tempArr.forEach((item)=>{ // 循环上面得到的数组,然后取每个的长度(题里说的几个),还有第一个数字(题里说的哪个数) var lth = item.length.toString() var num = item.substring(0,1) result = result+lth+num }) return result //最后返回结果 };

最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6

解释:

连续子数组 [4,-1,2,1] 的和最大,为 6。 进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

/** * @param {number[]} nums * @return {number} */ var maxSubArray = function(nums) { let ans = nums[0]; let sum = 0; for(const num of nums) { if(sum > 0) { sum += num; } else { sum = num; } ans = Math.max(ans, sum); } return ans; };
最新回复(0)