华为OD刷题C卷 - 每日刷题38(万能字符单词拼写,虚拟理财游戏)

2024-06-20 10:28

本文主要是介绍华为OD刷题C卷 - 每日刷题38(万能字符单词拼写,虚拟理财游戏),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、(万能字符单词拼写):

这段代码是解决“万能字符单词拼写”的问题。它提供了一个Java类Main,其中包含main方法和getResult方法,以及一个辅助方法success,用于计算使用给定字符chars能拼写出的单词words中的单词个数。

main方法首先读取单词数组words的个数和每个单词,然后读取掌握的字符control。接着,调用getResult方法并打印能拼写出的单词个数。

getResult方法遍历所有单词,并使用success方法检查每个单词是否能使用control中的字符拼写。如果能,计数器加一。

success方法首先统计control中万能字符?的数量。然后,遍历单词中的每个字符,检查该字符是否在control中。如果不在,但还有万能字符,就减少万能字符的数量;如果不在,且没有万能字符,则返回false。如果所有字符都能匹配,则返回true。

2、(虚拟理财游戏):

这段代码是解决“虚拟理财游戏”的问题。它提供了一个Java类Main,其中包含main方法,用于在虚拟游戏中选择最优的投资方式以获得最大回报。

main方法首先读取产品数、总投资额和可接受的总风险值。然后,读取每个产品的投资回报率、风险值和最大投资额度。接着,使用嵌套循环遍历所有可能的投资组合,更新最大投资回报和最小风险值,并记录最优投资策略。

最后,使用StringJoiner构建每个产品的投资额序列,并打印结果。

package OD371;import java.util.Arrays;
import java.util.Scanner;/*** @description 万能字符单词拼写* @level 4* @score 100*//*** 题目描述* 有一个字符串数组 words 和一个字符串 chars。* <p>* 假如可以用 chars 中的字母拼写出 words 中的某个“单词”(字符串),那么我们就认为你掌握了这个单词。* <p>* words 的字符仅由 a-z 英文小写字母组成,例如 "abc"* <p>* chars 由 a-z 英文小写字母和 "?" 组成。其中英文 "?" 表示万能字符,能够在拼写时当作任意一个英文字母。例如:"?" 可以当作 "a" 等字母。* <p>* 注意:每次拼写时,chars 中的每个字母和万能字符都只能使用一次。* <p>* 输出词汇表 words 中你掌握的所有单词的个数。没有掌握任何单词,则输出0。* <p>* 输入描述* 第一行:输入数组 words 的个数,记作N。* <p>* 第二行 ~ 第N+1行:依次输入数组words的每个字符串元素* <p>* 第N+2行:输入字符串chars* <p>* 输出描述* 输出一个整数,表示词汇表 words 中你掌握的单词个数* <p>* 备注* 1 ≤ words.length ≤ 100* 1 ≤ words[i].length, chars.length ≤ 100* 所有字符串中都仅包含小写英文字母、英文问号*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//单词数组个数int n = Integer.parseInt(sc.nextLine());//单词数组String[] words = new String[n];for (int i = 0; i < n; i++) {words[i] = sc.nextLine();}//掌握的字符String control = sc.nextLine();//输出能拼写出来的单词个数System.out.println(getResult(words, control));}//输出能用掌握的单词拼写出单词的个数public static int getResult(String[] words, String control) {int count = 0;for (int i = 0; i < words.length; i++) {if (success(words[i], control)) {count++;}}return count;}//判断word能否被已掌握的字符拼写出public static boolean success(String word, String control) {//统计control中?的个数char[] chars = control.toCharArray();int n = chars.length;int count = 0;for (int i = 0; i < n; i++) {if (chars[i] == '?') {count++;}}char[] words = word.toCharArray();int m = words.length;for (int i = 0; i < m; i++) {//如果字符不在已掌握的字符里或没有多余?号,则返回falseif (!control.contains(words[i] + "")) {//判断是否还有?if (count > 0) {count--;} else {return false;}} else {//每个字符只能用一次,所以需要把匹配到的字符去掉control = control.replaceFirst(words[i] + "", "");}}return true;}} 
package OD372;import java.util.*;/*** @description 虚拟理财游戏* @level 6* @score 100*//*** 题目描述* 在一款虚拟游戏中生活,你必须进行投资以增强在虚拟游戏中的资产以免被淘汰出局。* <p>* 现有一家Bank,它提供有若干理财产品 m 个,风险及投资回报不同,你有 N(元)进行投资,能接收的总风险值为X。* <p>* 你要在可接受范围内选择最优的投资方式获得最大回报。* <p>* 备注:* <p>* 在虚拟游戏中,每项投资风险值相加为总风险值;* 在虚拟游戏中,最多只能投资2个理财产品;* 在虚拟游戏中,最小单位为整数,不能拆分为小数;* 投资额*回报率=投资回报* 输入描述* 第一行:* <p>* 产品数(取值范围[1,20])* 总投资额(整数,取值范围[1, 10000])* 可接受的总风险(整数,取值范围[1,200])* 第二行:产品投资回报率序列,输入为整数,取值范围[1,60]* <p>* 第三行:产品风险值序列,输入为整数,取值范围[1, 100]* <p>* 第四行:最大投资额度序列,输入为整数,取值范围[1, 10000]* <p>* 输出描述* 每个产品的投资额序列*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//产品数 总投资额 可接受的总风险int[] line1 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();int m = line1[0];//[1,20]int n = line1[1];//[1,10000]int x = line1[2];//[1,200]//投资回报率序列int[] backs = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();//产品风险int[] risks = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();//最大投资额度序列int[] invests = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();//最大投资回报int max_invest_back = 0;//最小风险值int min_invest_risk = Integer.MAX_VALUE;//存放最后选择的iD和对应投资额Map<Integer, Integer> select = new HashMap<>();for (int i = 0; i < m; i++) {//如果当前产品风险大于最大风险,跳过if (risks[i] > x) {continue;}//如果投资单件产品最优if (risks[i] <= x) {//产品i的投资额int invest_i = Math.min(invests[i], n);//产品i的投资回报int back_i = invest_i * backs[i];//如果只投资i产品,投资回报高于当前的最优策略,或者等于最优但风险值更小if (back_i > max_invest_back || back_i == max_invest_back && risks[i] < min_invest_risk) {//更新最大投资回报max_invest_back = back_i;//更新最小风险min_invest_risk = risks[i];//把之前选择清空,重新选择select.clear();select.put(i, invest_i);}}//购买两个产品for (int j = i + 1; j < m; j++) {//如果总风险不超过risk_all 则都投资if (risks[i] + risks[j] <= x) {//产品i j分别的投资额int invest_i;int invest_j;//如果投资回报率不相同,则谁回报率高,谁多投if (backs[i] != backs[j]) {if (backs[i] > backs[j]) {//总和不能超过ninvest_i = Math.min(invests[i], n);invest_j = Math.min(invests[j], n - invest_i);} else {invest_j = Math.min(invests[j], n);invest_i = Math.min(invests[i], n - invest_j);}} else {//产品回报率相同,谁风险小,谁多投if (risks[i] < risks[j]) {invest_i = Math.min(invests[i], n);invest_j = Math.min(invests[j], n - invest_i);} else {invest_j = Math.min(invests[j], n);invest_i = Math.min(invests[i], n - invest_j);}}//投资两个产品的总投资回报int invest_back = invest_i * backs[i] + invest_j * backs[j];//总风险int invest_risk = risks[i] + risks[j];//如果大于当前最优投资回报 或等于但风险更小,则更新if (invest_back > max_invest_back || invest_back == max_invest_back && invest_risk < min_invest_risk) {max_invest_back = invest_back;min_invest_risk = invest_risk;//清空当前最优策略select.clear();//添加当前的最优策略 id 投资额if (invest_i > 0) {select.put(i, invest_i);}if (invest_j > 0) {select.put(j, invest_j);}}}}}//存放结果StringJoiner sj = new StringJoiner(" ");for (int k = 0; k < m; k++) {//如果id在select中,则添加对应的投资额if (select.containsKey(k)) {sj.add(select.get(k) + "");} else {sj.add("0");}}System.out.println(sj);}
}

这篇关于华为OD刷题C卷 - 每日刷题38(万能字符单词拼写,虚拟理财游戏)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077867

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

VirtualBox中,虚拟系统文件VDI移动或者复制

在安装virtualbox以后有时需要复制,移动虚拟磁盘等操作,这些操作在vmware的虚拟机下面可以直接操作虚拟磁盘即可使用,但是在virtualbox环境 下每个VDI 文件都有一个唯一的uuid,而VirtualBox 不允许注册重复的uuid,所以直接复制的VDI文件是不能拿来使用的,我们就需要使用到virtualbox自带的管理命令来克隆一个VDI,这样通过命令克隆的VDI文件会重

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

华为---OSPF的DR与BDR(六)

9.6 OSPF的DR与BDR 9.6.1 原理概述 在OSPF的广播类型网络和NBMA类型网络中,如果网络中有n台路由器,若任意两台路由器之间都要建立邻接关系,则需要建立n×(n-1)/2个邻接关系,即当路由器很多时,则需要建立和维护的邻接关系就很多,两两之间需要发送的报文也就很多,这会造成很多内容重复的报文在网络中传递,浪费了设备的带宽资源。因此在广播和NBMA类型网络中,OSPF协议定义

剑指offer(C++)--孩子们的游戏(圆圈中最后剩下的数)

题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去

剑指offer(C++)--翻转单词顺序列

题目 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class S

剑指offer(C++)--第一个只出现一次的字符

题目 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). class Solution {public:int FirstNotRepeatingChar(string str) {map<char, int> mp;for(int i = 0; i < str.size(); ++i)m

华为某员工爆料:偷偷跑出去面试,被面试官鄙视了。第一句话就问:华为淘汰的吧,35岁了,这个年龄在华为能混得下去吗?身体没啥毛病吧

“你都35岁了,难不成是被华为淘汰的?在华为混不下去了吧?身体没啥毛病吧,我们这体检可是很严的。” 近日,一位华为员工在朋友圈爆料,自己在面试时遭到了面试官的无理取闹和人身攻击,原因仅仅是因为他35岁了,曾经在华为工作过。 这番话,充满了傲慢与偏见,让人听了义愤填膺。这位面试官的言行,不仅是对求职者的不尊重,更是对职场规则的践踏。 面试本应是双向选择的过程,企业和求职者在相互了解的基

高性能并行计算华为云实验五:

目录 一、实验目的 二、实验说明 三、实验过程 3.1 创建PageRank源码 3.2 makefile的创建和编译 3.3 主机配置文件建立与运行监测 四、实验结果与分析 4.1 采用默认的节点数量及迭代次数进行测试 4.2 分析并行化下节点数量与耗时的变化规律 4.3 分析迭代次数与耗时的变化规律 五、实验思考与总结 5.1 实验思考 5.2 实验总结 E

每日一练:攻防世界:5-1 MulTzor

一、XorTool 基于 XOR(异或)运算实现。它可以帮助您快速地对文本、二进制文件进行加密解密操作。 认识XorTool工具: 让我们先去认识一下工具: xortool.py 是基于 python 的脚本,用于完成一些 xor 分析,包括: 猜想 key 的长度 猜想 key 的值 解密一些经过 xoe 加密的文件 也就是说当遇到不知道文件类型的文件,可以尝试去看看它是否被xo