问题描述 小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; }