华为OD统一考试 - 求幸存数之和
题目描述
给一个正整数数列 nums,一个跳数 jump,及幸存数量 left。
运算过程为:从索引0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存 left 个数为止,然后返回幸存数之和。
约束:
0是第一个起跳点
起跳点和命中点之间间隔 jump 个数字,已被敲出的数字不计入在内。
跳到末尾时无缝从头开始(循环查找),并可以多次循环。
若起始时 left > len(nums) 则无需跳数处理过程。
方法设计:
/**
* @param nums 正整数数列,长度范围 [1, 10000]
* @param jump 跳数,范围 [1, 10000]
* @param left 幸存数量,范围 [0, 10000]
* @return 幸存数之和
*/
int sumOfLeft(int[] nums, int jump, int left)
输入描述
第一行输入正整数数列
第二行输入跳数
第三行输入幸存数量
输出描述
输出幸存数之和
用例
输入
1,2,3,4,5,6,7,8,9
4
3
输出
13
说明
从1(索引为0)开始起跳,中间跳过 4 个数字,因此依次删除 6,2,8,5,4,7。剩余1,3,9,返回和为13
题目解析:
1.若数组为空,或left = 0,则直接返回0;
2.从下标位置start,跳过jump个部位'0'的数字,找到新的位置,并更新start;
3.直到将datas.size() - left个数字变成'0';
#牛客AI配图神器#
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <numeric>
int getLeftDataSum(std::vector<int>& datas, int jump, int left)
{
if (!left || datas.empty())
{
return 0;
}
int sum = 0;
int start = 0;
int size = datas.size();
int delNum = size - left;
while (delNum > 0)
{
int count = 0;
for (int i = (start + 1) % size; i < size;)
{
if (datas[i])
{
++count;
}
if (count == jump + 1)
{
datas[i] = 0;
start = i;
--delNum;
break;
}
i = ++i % size;
}
}
sum = std::accumulate(datas.begin(), datas.end(), 0);
return sum;
}
int main()
{
std::string dataStr;
std::cin >> dataStr;
std::istringstream inputStr(dataStr);
std::vector<int> datas;
std::string s;
while (std::getline(inputStr, s, ','))
{
datas.emplace_back(std::stoi(s));
}
int jump = 0;
std::cin >> jump;
int left = 0;
std::cin >> left;
std::cout << "幸存数之和:" << getLeftDataSum(datas, jump, left) << std::endl;
return 0;
}
给一个正整数数列 nums,一个跳数 jump,及幸存数量 left。
运算过程为:从索引0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存 left 个数为止,然后返回幸存数之和。
约束:
0是第一个起跳点
起跳点和命中点之间间隔 jump 个数字,已被敲出的数字不计入在内。
跳到末尾时无缝从头开始(循环查找),并可以多次循环。
若起始时 left > len(nums) 则无需跳数处理过程。
方法设计:
/**
* @param nums 正整数数列,长度范围 [1, 10000]
* @param jump 跳数,范围 [1, 10000]
* @param left 幸存数量,范围 [0, 10000]
* @return 幸存数之和
*/
int sumOfLeft(int[] nums, int jump, int left)
输入描述
第一行输入正整数数列
第二行输入跳数
第三行输入幸存数量
输出描述
输出幸存数之和
用例
输入
1,2,3,4,5,6,7,8,9
4
3
输出
13
说明
从1(索引为0)开始起跳,中间跳过 4 个数字,因此依次删除 6,2,8,5,4,7。剩余1,3,9,返回和为13
题目解析:
1.若数组为空,或left = 0,则直接返回0;
2.从下标位置start,跳过jump个部位'0'的数字,找到新的位置,并更新start;
3.直到将datas.size() - left个数字变成'0';
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <numeric>
int getLeftDataSum(std::vector<int>& datas, int jump, int left)
{
if (!left || datas.empty())
{
return 0;
}
int sum = 0;
int start = 0;
int size = datas.size();
int delNum = size - left;
while (delNum > 0)
{
int count = 0;
for (int i = (start + 1) % size; i < size;)
{
if (datas[i])
{
++count;
}
if (count == jump + 1)
{
datas[i] = 0;
start = i;
--delNum;
break;
}
i = ++i % size;
}
}
sum = std::accumulate(datas.begin(), datas.end(), 0);
return sum;
}
int main()
{
std::string dataStr;
std::cin >> dataStr;
std::istringstream inputStr(dataStr);
std::vector<int> datas;
std::string s;
while (std::getline(inputStr, s, ','))
{
datas.emplace_back(std::stoi(s));
}
int jump = 0;
std::cin >> jump;
int left = 0;
std::cin >> left;
std::cout << "幸存数之和:" << getLeftDataSum(datas, jump, left) << std::endl;
return 0;
}
全部评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享