【華為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.pswp.cn/news/164131.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164131.shtml
英文地址,請注明出處:http://en.pswp.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 本專欄所有的數據文件請點擊此鏈接下…