豆包MarsCode AI 刷题

66 阅读7分钟

问题描述 小C希望构造一个包含n个元素的数组,且满足以下条件:

数组中的所有元素两两不同。 数组所有元素的最大公约数为 k。 数组元素之和尽可能小。 任务是输出该数组元素之和的最小值。

测试样例 样例1:

输入:n = 3 ,k = 1 输出:6

样例2:

输入:n = 2 ,k = 2 输出:6

样例3:

输入:n = 4 ,k = 3 输出:30

解题思路 最大公约数为 k:这意味着数组中的每个元素都必须是 k 的倍数。 两两不同:我们需要确保数组中的元素是 k 的倍数,并且彼此不同。 元素之和最小:为了使元素之和最小,我们可以从最小的 k 的倍数开始,逐步增加,直到数组中有 n 个不同的元素。 具体步骤 从 k 开始,逐步增加 k 的倍数,直到找到 n 个不同的元素。 计算这些元素的和。 代码实现:

#include #include #include

using namespace std;

int solution(int n, int k) { int sum = 0; int current = k; for (int i = 0; i < n; i++) { sum += current; current += k; // 确保下一个数是 k 的倍数且不同 } return sum; }

int main() { std::cout << (solution(3, 1) == 6) << std::endl; std::cout << (solution(2, 2) == 6) << std::endl; std::cout << (solution(4, 3) == 30) << std::endl; }

总结 通过逐步增加 k 的倍数,我们可以确保数组中的元素两两不同,并且满足最大公约数为 k 的条件。这样构造的数组元素之和也是最小的。

游戏排名第三大的分数

问题描述 小M想要通过查看往届游戏比赛的排名来确定自己比赛的目标分数。他希望找到往届比赛中排名第三的分数,作为自己的目标。具体规则如下:

如果分数中有三个或以上不同的分数,返回其中第三大的分数。 如果不同的分数只有两个或更少,那么小M将选择最大的分数作为他的目标。 请你帮小M根据给定的分数数组计算目标分数。

测试样例 样例1:

输入:n = 3,nums = [3, 2, 1] 输出:1

样例2:

输入:n = 2,nums = [1, 2] 输出:2

样例3:

输入:n = 4,nums = [2, 2, 3, 1] 输出:1

代码如下

import java.util.Arrays;

public class Main { public static int solution(int n, int[] nums) { if(n==1){ return nums[0]; }else if(n==2){ if(nums[0]<nums[1]){ return nums[1]; }else{ return nums[0]; } }else{ Arrays.sort(nums); int max1 = nums[n - 1]; int max2 = 0; // 初始化 max2 int max3 = 0; // 初始化 max3 int c = -1; // 初始化 c for (int i = n - 1; i >= 0; i--) { if (nums[i]!= max1) { max2 = nums[i]; c = i; break; } } if(c==-1) return max1; for (int i = c - 1; i >= 0; i--) { if (nums[i]!= max2) { max3 = nums[i]; break; } } if(nums[0] == max2) return max1; return max3; } }

public static void main(String[] args) {
    System.out.println(solution(3, new int[]{3, 2, 1}) == 1);
    System.out.println(solution(2, new int[]{1, 2}) == 2);
    System.out.println(solution(4, new int[]{2, 2, 3, 1}) == 1);
}

}

问题描述

小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。

numbers: 一个由多个整数字符串组成的列表,每个字符串可以视为一个数字组。小M需要从每个数字组中选择一个数字。 例如对于[123, 456, 789],14个符合条件的数为:147 149 158 167 169 248 257 259 268 347 349 358 367 369。

def solution(numbers):
even_count = 0  # 记录偶数选择的组合数  
odd_count = 0   # 记录奇数选择的组合数  

# 初始情况下,没有任何选择,所以组合数为0
even_count = 1  # 初始化为1,因为至少有一种选择(即不选择任何数字)

for num in numbers:
    even = 0
    odd = 0
    str_num = str(num)

    # 统计当前数字组中的偶数和奇数  
    for ch in str_num:
        if int(ch) % 2 == 0:
            even += 1
        else:
            odd += 1

    # 更新组合数  
    new_even_count = even_count * even + odd_count * odd  # 偶数和偶数的组合 + 奇数和奇数的组合
    new_odd_count = even_count * odd + odd_count * even    # 偶数和奇数的组合

    even_count = new_even_count
    odd_count = new_odd_count

# 返回符合条件的组合数(偶数和的组合)  
return even_count  # 返回偶数和的组合数

测试用例

if name == "main": print(solution([123, 456, 789]) == 14) # 应输出 True print(solution([123456789]) == 4) # 应输出 True print(solution([14329, 7568]) == 10) # 应输出 True

叠盘子排序

问题描述 小明是个讲究生活质量的人,家里的一切都井井有条,比如说家中的盘子都是一个系列,每个盘子都标有唯一的一个整数作为标识。在每次吃完饭后,小明都会将这些盘子按照特定的顺序叠放收拾起来,收拾的规则如下:

盘子叠放后会被分为多堆,每一堆都可能是由一个或多个盘子组成 叠放在同一堆的盘子的序号都是不间断递增的(例如 1,2,3 为不间断递增,而 1,3,4 则只是普通的递增),并且这些盘子的数量至少是 3 个 这些盘子的序号在被叠放之前就是递增的 请问你可以编写一个程序,帮助小明算一算盘子该如何叠放么?

输入格式 空格分隔输入所有的数字

输出格式 一个字符串,每个堆被逗号分隔开,如果堆中只有一个盘子,就用序号表达;如果堆中有多个盘子,用『起始编号』+『-』+『终止编号』来表达。

输入样例(1)

-3 -2 -1 2 10 15 16 18 19 20

输出样例(1)

"-3--1,2,10,15,16,18-20"

输入样例(2)

-6 -3 -2 -1 0 1 3 4 5 7 8 9 10 11 14 15 17 18 19 20

输出样例(2)

"-6,-3-1,3-5,7-11,14,15,17-20"

输入样例(3)

1 2 7 8 9 10 11 19

输出样例(3)

"1,2,7-11,19"

解题思路: 问题理解 输入:一个整数序列,表示盘子的标识。 输出:一个字符串,表示盘子的叠放方式。 规则: 盘子需要被分成多个堆。 每个堆中的盘子序号是不间断递增的,并且至少有3个盘子。 如果堆中只有一个盘子,直接输出该盘子的序号。 如果堆中有多个盘子,输出起始编号和终止编号,用“-”连接。

#include <iostream>

#include #include

using namespace std;

std::string solution(std::vector &plates, int n) { string s = ""; if (plates.empty()) return s;

int start = plates[0]; // 当前堆的起始编号 int end = plates[0]; // 当前堆的终止编号

for (int i = 1; i < plates.size(); i++) { if (plates[i] == end + 1) { // 如果当前盘子是前一个盘子的序号加1,更新终止编号 end = plates[i]; } else { // 否则,处理当前堆 if (end - start >= 2) { // 如果堆的长度大于等于3 s += to_string(start) + "-" + to_string(end) + ","; } else { // 如果堆的长度小于3 for (int j = start; j <= end; j++) { s += to_string(j) + ","; } } // 更新起始和终止编号 start = plates[i]; end = plates[i]; } }

// 处理最后一个堆 if (end - start >= 2) { s += to_string(start) + "-" + to_string(end); } else { for (int j = start; j <= end; j++) { s += to_string(j) + ","; } }

// 去掉最后一个逗号 if (!s.empty() && s.back() == ',') { s.pop_back(); }

return s; }

int main() { // You can add more test cases here std::vector plates1 = {-3, -2, -1, 2, 10, 15, 16, 18, 19, 20}; std::cout << (solution(plates1, 10) == "-3--1,2,10,15,16,18-20") << std::endl;

std::vector plates2 = {-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20}; std::cout << (solution(plates2, 20) == "-6,-3-1,3-5,7-11,14,15,17-20") << std::endl;

std::vector plates3 = {1, 2, 7, 8, 9, 10, 11, 19}; std::cout << (solution(plates3, 8) == "1,2,7-11,19") << std::endl;

return 0; }