【华为OD题库-032】数字游戏-java

题目

小明玩一个游戏。系统发1+n张牌,每张牌上有一个整数。第一张给小明,后n张按照发牌顺序排成连续的一行。需要小明判断,后n张牌中,是否存在连续的若干张牌,其和可以整除小明手中牌上的数字.
输入描述:
输入数据有多组,每组输入数据有两行,输入到文件结尾结束。
第一行有两个整数n和m,空格隔开。m代表发给小明牌上的数字
第二行有n个数,代表后续发的n张牌上的数字,以空格隔开。
输出描述:
对每组输入,如果存在满足条件的连续若干张牌,则输出1:否则,输出0
补充说明:
1<=n<= 1000
1<=牌上的整数<= 400000输入的组数,不多于1000
用例确保输入都正确,不需要考虑非法情况
示例1
输入:
6 7
2 12 6 3 5 5
10 11
1 1 1 1 1 1 1 1 1 1
输出
0
说明:
两组输入。
第一组小明牌的数字为7,再发了6张牌。第1、2两张牌数字和为14,可以整除7,输出1。
第二组小明牌的数字为11,再发了10张牌,这10张牌数字和为10,无法整除11,输出0。

思路

以单组数据来看,对于给定数组nums,是否存在连续和能够被指定k整除?可以想到一下几种方案:

  1. 暴力破解
  2. 组合思想
  3. 前缀和

思路一:暴力破解

双层循环:
外层i表示,依次以i开始的连续数组
内存循环变量j,初始值为i。求以i开始的连续数组的和,(即nums[i]+nums[i+1]+…+nums[j]),如果存在某个和能够被k整除,那么返回1
两层遍历完了都没有找到这样的连续数组,那么返回0

思路二:组合思想

找到nums所有的子连续数组:组合思想可参考:【JAVA-排列组合】一个套路速解排列组合题。
剪枝的关键在于判断数组是否连续,path中可以存放位置,如果是连续,那么path最后一个位置应该等于当前位置-1,即:i-1=path.peekLask();
如果某个子数组的和能够被k整除,那么返回1,否则返回0

思路三:前缀和
参考leetcode原题:974. 和可被 K 整除的子数组
leetcode的题目考虑了负数,虽然本题的牌的数字不会有正数,但这里还是对正负数都考虑进来。

设P[i]为nums数组的前i项的和
对于sum(i,j)=num[i]+num[i+1]+…+num[j]=P[j]-P[i-1]。
假设nums的i~j区间的和能够被k整除。
即:sum(i,j)%k==0,即(P[j]-P[i-1])%k=0,
即:(P[j]%k - P[i-1]%k)%k=0。
考虑同为正负的情况:P[j]%k == P[i-1]%k时上式成立
如果一正一负:|P[j]%k - P[i-1]%k| = k时上式成立,假设P[j]%k为正,P[i-1]%k为负,那么去掉绝对值后表达式为:P[j]%k = k+P[i-1]%k
综合正负数的情况,表达式可以写为:(P[j]%k+k)%k == (k+P[i-1]%k)%k,即,当前缀和为s时,考虑s可能为负数的情况,那么对k求余数可以写为: (s%k+k)%k

上面的推导可能比较抽象,现在以具体数据来说明过程:
假设我们的nums为:4 5 -4 -2 -7 -3 1,k为5。以下3行分别为nums,前缀和,对k求余((s%k+k)%k)的结果:
在这里插入图片描述
依次遍历nums,找到以当前nums[j]结尾的连续数组,判断其和能够整除k的数组有多少个?
j=0时,nums[j]=4,要满足(P[j]%k - P[i-1]%k)%k=0,才能找到满足条件的连续数组,现在P[j]%k=4,是否存在P[i-1]%k=4?i必须小于等于j, 明显不存在。
j=1时,P[j]%k=4,是否存在P[i-1]%k=4,即在j前面的求余结果是否有4,第一个为4,存在(i=1)。也就是说sum(1,1)能够被5整除。
j=2时,P[j]%k=0,第三行在位置2之前是否存在0?根据上面的逻辑不存在,但是实际上此时余数都为0了,肯定是能被k整除的,可以在0的左侧假设有P[-1]=0,这样当余数为0时,就能保证一定能够找到一个相同值,从而判断为满足条件。即sum(0,2)能够被5整除
j=3,P[j]%k=3,前面找不到
j=4,P[j]%k=1,前面找不到
j=5,P[j]%k=3,找得到,当i=4时,P[3]%k=3,即sum(4,5)能够被5整除
j=6,P[j]%k=4,在其前面能够找到4,i分别为1和2时,P[0]%k=4,P[1]%k=4,即sum(1,6),sum(2,6)均能被5整除

综上:我们可以用一个变量来存放前缀和%k出现的次数,比如map。然后遍历nums,先求出当前的前缀和sum,再求余数mod=(sum%k+k)%k,然后在map中找是否存在map.get(mod)>0,如果存在,那么就找到了这样的连续数组,如果不存在,则将map.get(mod)++后继续查找。
前缀和%k的值域范围刚好为:0~k-1,所以也可以用一个数组dp来代替map,它标识的含义是,mod值等于key出现了val次。考虑到要设P[-1]=0,即mod值为0在初始状态就要出现一次,那么将dp[0]=1。

题解

给出了三种思路在本题的具体实现,前缀和确实很抽象,也不好表达,对此不理解的多看看974. 和可被 K 整除的子数组的题解

package hwod;import java.util.*;
import java.util.stream.Collectors;public class NumberGame {public static void main(String[] args) {Scanner sc = new Scanner(System.in);List<Integer> list1 = new ArrayList<>();//存放给定的牌List<List<Integer>> list2 = new ArrayList<>();//牌堆while (sc.hasNextLine()) {String firstLines = sc.nextLine();if ("".equals(firstLines)) break;list1.add(Arrays.stream(firstLines.split(" ")).mapToInt(Integer::parseInt).toArray()[1]);String secondLines = sc.nextLine();list2.add(Arrays.stream(secondLines.split(" ")).mapToInt(Integer::parseInt).boxed().collect(Collectors.toList()));}List<Integer> res = numberGame(list1, list2);for (Integer re : res) {System.out.println(re);}}private static List<Integer> numberGame(List<Integer> list1, List<List<Integer>> list2) {List<Integer> res = new ArrayList<>();for (int i = 0; i < list1.size(); i++) {res.add(checked3(list2.get(i), list1.get(i)));}return res;}/*** 暴力破解* @param list   牌堆* @param target 被除的值* @return 如果存在连续和能够整除target,返回1,否则返回0*/private static int checked(List<Integer> list, Integer target) {for (int i = 0; i < list.size(); i++) {int sum = 0;for (int j = i; j < list.size(); j++) {sum += list.get(j);if (sum % target == 0) return 1;}}return 0;}private static int res = 0;/*** 组合思想* @param list* @param target* @return*/private static int checked2(List<Integer> list, Integer target) {LinkedList<Integer> path = new LinkedList<>();dfs(list, 0, path, 0, target);return res;}private static void dfs(List<Integer> list, int start, LinkedList<Integer> path, int sum, int k) {if (!path.isEmpty() && sum % k == 0) {res = 1;return;}for (int i = start; i < list.size(); i++) {if (!path.isEmpty() && path.peekLast() != i - 1) continue;if (res != 0) break;path.addLast(i);dfs(list, i + 1, path, sum + list.get(i), k);path.removeLast();}}/*** 设P[i]为前i项的前缀和* sum(i,j)=num[i]+num[i+1]+...+num[j]=P[j]-p[i-1]* (P[j]-p[i])%k==0  ==>  (P[j]%k - p[i-1]%k)%k=0** @param list* @param k* @return 如果存在连续和能够整除k,返回1,否则返回0*/private static int checked3(List<Integer> list, Integer k) {int[] dp = new int[k];dp[0] = 1;int sum = 0;for (int i = 0; i < list.size(); i++) {sum += list.get(i);int mod = (sum % k + k) % k;if (dp[mod] != 0) return 1;dp[mod]++;}return 0;}
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/164131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式基础知识学习:Flash、EEPROM、RAM、ROM

https://blog.csdn.net/y673533511/article/details/87913989 FLASH存储器又称闪存&#xff0c;它结合了ROM和RAM的长处&#xff0c;不仅具备电子可擦出可编程(EEPROM) 的性能&#xff0c;还不会断电丢失数据同时可以快速读取数据 (NVRAM 的优势)&#xff0c;U 盘和MP3 里用的…

[论文笔记]MatchPyramid

引言 又一篇文本匹配论文Text Matching as Image Recognition,论文题目是 文本匹配当成图像识别。 挺有意思的一篇工作,我们来看它是如何实现的。 作者受到卷积神经网络在图像识别中成功应用的启发,其中神经元可以捕获很多复杂的模式,作者提出将文本匹配看作是图像识别任…

DDD落地:从网易新闻APP重构,看DDD的巨大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

GEE:梯度提升树(Gradient Boosting Tree)分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上进行梯度提升树(Gradient Boosting Tree)分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量(各种指数、纹理特征、时间序列特征、物候特征…

OpenStack云计算平台-启动一个实例

目录 一、创建虚拟网络 ​二、创建m1.nano规格的主机 三、生成一个键值对 四、增加安全组规则 ​五、启动一个实例 1、确定实例选项 2、创建实例 3、使用虚拟控制台访问实例 4、验证能否远程访问实例 一、创建虚拟网络 下面的说明和框图使用示例IP 地址范围。你必须依…

Altium Designer学习笔记12

把几个层理解下&#xff1a; layer名称功能说明信息Toplayer信号层铜箔层&#xff0c;电气连接的层Bottomlayer信号层铜箔层&#xff0c;电气连接的层Internal Planes内层连接地和电源上&#xff0c;一般情况下不布线&#xff0c;是由整片铜膜组成的Mechanical 1机械层电路板机…

String 、StringBuffer 和 StringBuilder 的区别?

String 使用 String 声明一个字符串的时候&#xff0c;该字符串会存放在堆中的字符串常量池中。因为在java中所有的String 都是以常量表示&#xff0c;且由 final 修饰&#xff0c;因此在线程池中它的线程是安全的 且 不可变的 。每个 String 在被创建后就不再发生任何变化。 …

mysql按年、季度、月,统计

以下是按年、按季度和按月统计SQL查询语句&#xff1a; 按年统计&#xff1a; SELECTds.checker,YEAR(ds.create_time) AS settleYear,SUM(ds.quantity) AS quantity,SUM(ds.approval_price) AS approvalPrice FROMdata_settle ds WHEREds.delete_flag 0AND ds.approval_sta…

漏洞盒子公益SRC

漏洞盒子公益SRC&#xff0c;小小地记录一下第一个月的成果

数据中台建设方法论

1、数仓的概念和了解--业务的痛点 产生的痛点&#xff1a;数据资产比较模糊、数据的质量比较低、重复建设、代码的耦合性比较强。 2、数据仓库中的常见的模型&#xff1a; 1、心型模型&#xff1a;中间是一张事实表&#xff0c;周围都是维度表。 对于心型模型的主要的特点&a…

面向未来的自动化:拥抱机器人即服务(RaaS)

01. RaaS是什么&#xff1f; 对于希望实现业务流程自动化的公司来说&#xff0c;机器人通常是一笔巨大的资本支出。由于机器人非常昂贵&#xff0c;公司可能需要等待数年才能看到投资回报。正是由于这一现实&#xff0c;许多较小的组织无法投资机器人。 但一些机器人公司正在采…

算法通关村第十二关-青铜挑战字符串

大家好我是苏麟 , 今天带来字符串专题 . 转换成小写字母 描述 : 给你一个字符串 s &#xff0c;将该字符串中的大写字母转换成相同的小写字母&#xff0c;返回新的字符串。 题目 : LeetCode 709.转换成小写字母 : 709. 转换成小写字母 分析 : 这个题可以先遍历整个字符串…

Mybatis和MybatisPlus:数据库操作工具的对比

目录 什么是mybatis 什么是mybatisplus MyBatis-Plus&#xff1a;为简化数据库操作而生的强大工具 一、MyBatis-Plus的背景和概述 二、MyBatis-Plus的主要特点 三、如何使用MyBatis-Plus mybatis-Plus的优势 什么是Hibernate Hibernate&#xff1a;Java开发者的数据持久…

光谱图像超分 Benchmark

光谱图像超分 Benchmark 文章目录 光谱图像超分 Benchmark0. pioneer工作及综述基于深度学习的高光谱多光谱融合&#xff08;updating&#xff09;1. 空间光谱图像超分 &#xff08;to be updated&#xff09;2. 高分辨率多光谱图像超分&#xff08;to be updated&#xff09;3…

重生之我是一名程序员 39 ——C语言题目之青蛙跳台阶

哈喽啊大家晚上好&#xff01;今天给大家带来的是C语言经典题目之青蛙跳台阶。青蛙跳台阶是一个数学问题&#xff0c;也是一个经典的递归问题。假设一只青蛙要跳上一个n级台阶&#xff0c;它可以每次跳1级台阶或2级台阶。问&#xff1a;青蛙跳上这个n级台阶总共有多少种不同的跳…

AMESim|学习记录

此文记录AMESim学习过程中的各种情况。 目录 01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017.01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017. 01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017. 开始步入正文 01 王佳.…

【Leetcode合集】14. 最长公共前缀

14. 最长公共前缀 14. 最长公共前缀 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 …

【UE】用样条线实现测距功能(下)

目录 效果 步骤 一、实现多次测距功能 二、通过控件蓝图来进行测距 在上一篇&#xff08;【UE】用样条线实现测距功能&#xff08;上&#xff09;&#xff09;文章基础上继续实现多次测距和清除功能。 效果 步骤 一、实现多次测距功能 打开蓝图“BP_Spline”&#xff0c…

cherry pick的使用

https://blog.csdn.net/weixin_55229531/article/details/128726872

SPS简单对应分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…