当前位置: 首页 > news >正文

字节青训-多米诺骨牌均衡状态、红包运气排行榜

目录

一、多米诺骨牌均衡状态

问题描述

测试样例

解释

解题思路:

问题理解

数据结构选择

算法步骤

最终代码:

运行结果:

二 、红包运气排行榜

问题描述

测试样例

解题思路: 

问题理解

数据结构选择

算法步骤

最终代码:

 

运行结果: 


一、多米诺骨牌均衡状态

问题描述

小S玩起了多米诺骨牌,他排列了一行骨牌,并可能将某些骨牌向左或向右推倒。随着骨牌连锁反应的进行,一些骨牌可能因为左右两侧受力平衡而保持竖立。现在小S想要知道在所有动作完成后,哪些骨牌保持竖立。

给定一个表示骨牌初始状态的字符串,其中:

  • "L" 表示该位置的骨牌将向左倒。
  • "R" 表示该位置的骨牌将向右倒。
  • "." 表示该位置的骨牌初始时保持竖立。

模拟整个骨牌倒下的过程,求出最终仍然保持竖立的骨牌的数目和位置。

测试样例

样例1:

输入:num = 14, data = ".L.R...LR..L.." 输出:'4:3,6,13,14'

样例2:

输入:num = 5, data = "R...." 输出:'0'

样例3:

输入:num = 1, data = "." 输出:'1:1'

解释

  • 样例1

    • 输入字符串 ".L.R...LR..L.." 表示有 14 个骨牌,初始状态为竖立、向左倒、竖立、向右倒,等等。
    • 最终结果是 '4:3,6,13,14',表示有 4 个骨牌保持竖立,位置分别是 3, 6, 13, 14。
  • 样例2

    • 输入字符串 "R...." 表示有 5 个骨牌,第一个骨牌向右倒,其余保持竖立。
    • 最终结果是 '0',表示没有骨牌保持竖立。
  • 样例3

    • 输入字符串 "." 表示有 1 个骨牌,初始状态为竖立。
    • 最终结果是 '1:1',表示有 1 个骨牌保持竖立,位置是 1。

解题思路:

 

问题理解

你有一个字符串表示骨牌的初始状态,其中:

  • "L" 表示该位置的骨牌将向左倒。
  • "R" 表示该位置的骨牌将向右倒。
  • "." 表示该位置的骨牌初始时保持竖立。

你需要模拟整个骨牌倒下的过程,并找出最终仍然保持竖立的骨牌的数目和位置。

数据结构选择

  1. 字符串:用于存储骨牌的初始状态和最终状态。
  2. :用于处理骨牌的倒下过程。我们可以使用栈来模拟骨牌的连锁反应。

算法步骤

  1. 初始化:创建一个与输入字符串长度相同的数组,用于记录每个位置的骨牌最终状态。
  2. 遍历字符串
    • 如果遇到 "L",则从当前位置向左遍历,直到遇到 "R" 或字符串边界。
    • 如果遇到 "R",则从当前位置向右遍历,直到遇到 "L" 或字符串边界。
    • 如果遇到 ".",则继续遍历。
  3. 处理连锁反应
    • 当 "L" 和 "R" 相遇时,根据它们之间的距离和方向,决定哪些骨牌会倒下,哪些会保持竖立。
  4. 统计结果:遍历最终状态数组,统计仍然保持竖立的骨牌的数目和位置。

最终代码:

 

#include <iostream>
#include <string>
#include <vector>using namespace std;std::string solution(int num, std::string data) {// 初始化最终状态数组vector<char> finalState(num, '.');// 遍历字符串for (int i = 0; i < num; ++i) {if (data[i] == 'L') {finalState[i] = '-';// 处理向左倒的情况for (int j = i - 1; j >= 0; --j) {if (data[j] == 'R') {// 计算 "L" 和 "R" 之间的距离int distance = i - j;if (distance % 2 == 0) {// 距离为偶数,中间的骨牌保持竖立finalState[(i+j)/2] = '.';} else {// 距离为奇数,中间的两个骨牌都倒finalState[(i+j)/2] = finalState[(i+j)/2+1] = '-';}break;} else if (data[j] == 'L') {break; // 遇到另一个 "L",停止} else if (data[j] == '.') {finalState[j] = '-'; // 更新状态}}} else if (data[i] == 'R') {finalState[i] = '-';// 处理向右倒的情况for (int j = i + 1; j < num; ++j) {if (data[j] == 'L') {// 计算 "R" 和 "L" 之间的距离int distance = j - i;if (distance % 2 == 0) {// 距离为偶数,中间的骨牌保持竖立finalState[(i+j)/2] = '.';} else {// 距离为奇数,中间的两个骨牌都倒finalState[(i+j)/2] = finalState[(i+j)/2+1] = '-';}break;} else if (data[j] == 'R') {break; // 遇到另一个 "R",停止} else if (data[j] == '.') {finalState[j] = '-'; // 更新状态}}}}// 统计结果string result;int count = 0;string positions;for (int i = 0; i < num; ++i) {if (finalState[i] == '.') {// 记录保持竖立的骨牌位置if (count > 0) positions += ",";positions += std::to_string(i + 1);count++;}}// 构建结果字符串result = std::to_string(count);if (count > 0) result += ":" + positions;return result;
}int main() {//  You can add more test cases herestd::cout << (solution(14, ".L.R...LR..L..") == "4:3,6,13,14") << std::endl;std::cout << (solution(5, "R....") == "0") << std::endl;std::cout << (solution(1, ".") == "1:1") << std::endl;return 0;
}

运行结果:

二 、红包运气排行榜

问题描述

小C参与了一场抢红包的游戏,现在他想要对所有参与抢红包的人进行一次运气排名。排名规则如下:抢到的金额越多,排名越靠前;如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。比如,如果小C和小U抢到的金额相同,但小C比小U先抢,则小C排在小U前面。

测试样例

样例1:

输入:n = 4 ,s = ["a", "b", "c", "d"] ,x = [1, 2, 2, 1] 输出:['b', 'c', 'a', 'd']

样例2:

输入:n = 3 ,s = ["x", "y", "z"] ,x = [100, 200, 200] 输出:['y', 'z', 'x']

样例3:

输入:n = 5 ,s = ["m", "n", "o", "p", "q"] ,x = [50, 50, 30, 30, 20] 输出:['m', 'n', 'o', 'p', 'q']

解题思路: 

 

问题理解

你需要对抢红包的人进行排名,排名规则如下:

  1. 抢到的金额越多,排名越靠前。
  2. 如果两个人抢到的金额相同,则按照他们抢红包的顺序进行排名。

数据结构选择

  1. **使用 vector<pair<string, int>>**:这个数据结构可以存储每个人的名字和抢到的金额。
  2. **使用 map<string, int>**:虽然你不想使用 map,但 map 可以自动处理键的唯一性,并且在插入时可以累加值。

算法步骤

  1. 初始化数据结构:使用 vector<pair<string, int>> 来存储每个人的名字和抢到的金额。
  2. 插入数据并累加:遍历输入的 s 和 x,检查 vector 中是否已经存在相同的字符串。如果存在,则累加其对应的值;如果不存在,则将新的字符串和值插入到 vector 中。
  3. 排序:使用自定义的比较函数对 vector 进行排序。比较函数首先比较金额,如果金额相同,则保持插入顺序。
  4. 提取结果:将排序后的 vector 中的名字提取到结果向量 result 中。

最终代码:

 

#include <bits/stdc++.h>
using namespace std;// 自定义比较函数
bool cmp(const pair<string, int>& a, const pair<string, int>& b) {if (a.second != b.second) {return a.second > b.second; // 按照值从大到小排序}return false; // 如果值相同,保持插入顺序
}vector<string> solution(int n, vector<string> s, vector<int> x) {// 使用 vector 来存储数据,并在插入时进行累加vector<pair<string, int>> vec;for (int i = 0; i < n; ++i) {bool found = false;for (auto& p : vec) {if (p.first == s[i]) {p.second += x[i];found = true;break;}}if (!found) {vec.push_back({s[i], x[i]});}}sort(vec.begin(), vec.end(), cmp);// 提取排序后的名字vector<string> result;for (const auto& p : vec) {result.push_back(p.first);}return result;
}int main() {cout << (solution(4, {"a", "b", "c", "d"}, {1, 2, 2, 1}) == vector<string>{"b", "c", "a", "d"}) << endl;cout << (solution(3, {"x", "y", "z"}, {100, 200, 200}) == vector<string>{"y", "z", "x"}) << endl;cout << (solution(5, {"m", "n", "o", "p", "q"}, {50, 50, 30, 30, 20}) == vector<string>{"m", "n", "o", "p", "q"}) << endl;return 0;
}

运行结果: 


http://www.mrgr.cn/news/71862.html

相关文章:

  • JDBC编程---Java
  • Rust学习(八):异常处理和宏编程:
  • 【大模型-智能体】AutoGen Studio测试和导出工作流程
  • MySQL 报错:1137 - Can‘t reopen table
  • 数据新时代:如何选择现代数据治理平台(上)
  • Go语言中的条件变量:sync.NewCond
  • SQL练习(2)
  • Python 进阶函数教程
  • xxl-job报错Connection refused: connect(连接被拒绝)
  • PostgreSQL序列:创建、管理与高效应用指南
  • 【MySQL】数据库知识突破:数据类型全解析与详解
  • Pandas中astype() 方法
  • 「Mac玩转仓颉内测版5」入门篇5 - Cangjie控制结构(上)
  • 大数据 ETL + Flume 数据清洗 — 详细教程及实例(附常见问题及解决方案)
  • 10款视频剪辑工具使用感受与适用场景推荐!!!!
  • kaggle 如何利用API下载数据集
  • Linux驱动开发(5):平台设备驱动
  • Java 网络通信之 Socket 编程全解析
  • 番外篇 | 关于YOLO11算法的改进点总结
  • 【java】如何理解线程安全问题
  • 轻松搭建自己的RAG知识库
  • 论文2—《基于柔顺控制的智能神经导航手术机器人系统设计》文献阅读分析报告
  • 代码训练营 day64|算法优化、带负权值图的最短路径
  • 一维前缀和/差分,二维前缀和/差分
  • 【时时三省】(C语言基础)函数介绍strtok
  • 概率论中的PMF、PDF和CDF