大家好,今天我将分享两个MarsCode AI刷题的题目和解决方案。首先是版本号比较问题,然后是数组逆序对的生成问题。也接触了一个月豆包刷题了,它其实就像在刷题的时候有个导师带着学习一样的,对刷题的人挺友好的——虽然有弊端,对于走过场的人,噢不,走过场的人不应该会点开这个。
第一题——版本号比较
一看到这题我就来劲了,因为这是我面试中遇到的一道编程题,不过还好写出来了。所以这题对我来说轻轻松松。
问题描述
在软件工程中,版本号是标识软件版本的重要方式。每个版本号由多个修订号组成,修订号之间由点号.
分隔。你需要编写一个函数,比较两个版本号version1
和version2
,判断哪个版本更新,或者它们是否相同。
示例
例如,版本号"2.5.33"
和"0.1"
都是有效的版本号。比较时,需要从左到右依次比较它们的修订号,忽略前导零。
解答思路
先将版本号按点号分割成数组,然后逐个比较修订号的整数值。如果数组长度不同,在较短的数组末尾补零。比较过程中,一旦发现不等,即可确定大小关系。
实现代码
function solution(version1, version2) {
let v1Parts = version1.split('.');
let v2Parts = version2.split('.');
let maxLength = Math.max(v1Parts.length, v2Parts.length);
v1Parts = v1Parts.concat(Array(maxLength - v1Parts.length).fill('0'));
v2Parts = v2Parts.concat(Array(maxLength - v2Parts.length).fill('0'));
for (let i = 0; i < maxLength; i++) {
let v1Int = parseInt(v1Parts[i]);
let v2Int = parseInt(v2Parts[i]);
if (v1Int > v2Int) {
return 1;
} else if (v1Int < v2Int) {
return -1;
}
}
return 0;
}
// 测试用例
console.log(solution("0.1", "1.1") === -1);
console.log(solution("1.0.1", "1") === 1);
console.log(solution("7.5.2.4", "7.5.3") === -1);
console.log(solution("1.0", "1.0.0") === 0);
完美解决
第二题——小C的逆序对挑战
问题描述
给定一个长度为n
的数组a
,通过增加或减少数组元素的操作,使得数组中出现至少一个逆序对。每次操作可以选择增加或减少一个元素。逆序对的定义是,存在下标对(i, j)
满足1 ≤ i < j ≤ n
且a[i] > a[j]
。
解答思路
首先检查数组是否已经包含逆序对,如果包含则无需操作。否则,计算将第一个元素增加或最后一个元素减少到可以形成逆序对的最小操作次数。
实现代码
function solution(n, x, y, a) {
for (let i = 0; i < n - 1; i++) {
if (a[i] > a[i + 1]) {
return 0;
}
}
let min_cost = Math.min(a[0] + x, a[a.length - 1] - y);
if (a[0] + x < a[a.length - 1] - y) {
if (a[0] + x > a[1]) {
return 1;
} else {
return Math.floor((a[1] - a[0] - 1) / x) + 1;
}
} else {
if (a[a.length - 1] - y < a[a.length - 2]) {
return 1;
} else {
return Math.floor((a[a.length - 1] - a[a.length - 2] - 1) / y) + 1;
}
}
}
// 测试用例
console.log(solution(3, 1, 2, [1, 3, 5]) === 2);
console.log(solution(4, 5, 7, [4, 6, 10, 9]) === 0);
console.log(solution(5, 3, 2, [7, 7, 7, 7, 7]) === 1);
这是实现的步骤
- 检查数组:首先检查数组
a
中是否存在逆序对。如果存在,那么我们可以直接返回0,因为数组已经是逆序的,不需要任何操作。 - 计算最小操作成本:如果数组中没有逆序对,我们需要计算至少需要多少次操作才能生成一个逆序对。
- 确定操作方向:我们需要确定是增加数组的第一个元素,还是减少最后一个元素。这取决于哪个操作的成本更低。
- 计算操作次数:一旦确定了操作方向,我们就可以计算出生成逆序对所需的最小操作次数。
也是成功提交了,今天的分享就到这里了