- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在研究这个问题,提交我的代码后7个案例通过了,但是9个案例失败了。 HackerRank 的问题链接在这里:Electronic Shop
问题陈述
一个女孩想买一个键盘和一个 USB 驱动器,她想在预算范围内尽可能多地花钱(结合这两个项目)。如果这两种商品的价格都超出了她的预算,则返回 -1 否则她将无法购买。强制性条件是她想同时购买这两件商品,而不是一件。
示例
键盘范围以数组形式给出[40, 50, 60]
,USB驱动器以[5,8,12]
形式给出.她的最大预算是 60
。现在,如果我们总结这两件事,我们会得到两个组合的最大值:
因为 58 大,所以她会得到值(value) 50 和 8 的元素。
输入格式
输出格式
打印一个整数表示 Monica 将花费的金额。如果她没有足够的钱购买一个键盘和一个 USB 驱动器,则改为打印 -1。
我的算法
1. Take answer variable as 0, and max value initialize it with first element of keyboard + first element of usb drives
2. loop through keyboard, make an inner loop for usb
3. Compare keyboard[i] + drives[j], if greater than b, then return -1.
4. Else find the max value and assign it to answer
5. return answer
我的逻辑与要求一样简单,但对于数组中元素数量非常多的情况,不知何故失败了。
代码
static int getMoneySpent(int[] keyboards, int[] drives, int b) {
int answer = 0, maxAmount = keyboards[0] + drives[0];
//This will compare the value of i+j throughout the loop and returns the max one
for(int i: keyboards){
for(int j: drives){
// Ofcourse if all i+j values will be greater than the max budget then -1
if((i+j) > b)
answer = -1;
else if((i+j) == b){
answer = i+j;
}else{
/*If the value is smaller than the max budget, the finding the max value we get after adding them and comparing with the maxAmount variable */
if((i+j) > maxAmount){
maxAmount = i+j;
answer = maxAmount;
}
}
}
}
return answer;
}
我有两个失败的案例,它们是:
失败的测试用例 1
输入=>
539855 818 628
380710 674456 878173 532602 868253 721585 806107 141310 790209 212031
304748 818920 80938 322601 403071 22899 173564 153826 695108 223665
346178 957539 975830 573171 641117 932941 822666 575293 132555 479463
862209 313799 922966 606508 487172 139230 606390 898464 764983 829520
174879 317603 502680 953013 398753 825387 146407 666457 367618 121790
68188 478342 25818 506222 135197 232604 963333 79984 549654 776899
966040 122063 432596 594425 311887 936661 506256 876303 439611 277816
105689 851641 640971 333 216087 17692 619728 602689 650348 364881
152060 386548 61364 564569 780938 191826 459905 211804 58177 484711
995091 754424 57794 619638 695192 297423 983901 430435 239234 170704
142282 74647 121413 782873 303344 265448 101069 177807 692318 691774
62306 618191 509537 633333 996922 228947 814154 232698 615359 220853
306323 173792 624037 655872 527161 848207 426180 724481 130740 792273
886804 404890 449886 654224 194667 354317 367843 525624 414224 481744
827725 176927 733780 387166 769479 964040 1{-truncated-}
预期输出
539854
这里是完整的输入数据链接:Input Array Data Full
失败的测试用例 2
输入=>
374625 797 951
183477 732159 779867 598794 596985 156054 445934 156030 99998 58097
459353 866372 333784 601251 142899 708233 651036 20590 56425 970129
722162 832631 938765 212387 779 181866 992436 183446 617621 304311
611791 524875 7068 432043 23068 291295 524893 611991 399952 139526
46677 292211 973975 366445 232824 456173 90627 785353 618526 199719
382549 514351 983453 592549 466869 46461 860135 607682 680461 170563
450601 65067 13268 949100 942415 965850 563416 808580 385504 304683
15970 97695 230946 684388 241080 440252 683418 122066 610135 495289
833383 34397 173404 909526 391149 258839 182278 662672 755532 311782
425252 520186 207989 546834 567829 184897 31321 969804 842475 775308
449856 939711 395240 895029 926868 598035 727436 922082 326615 88513
570573 196028 520952 45238 961389 325404 844725 388765 747489 271411
539814 828925 586884 356834 965473 280998 607171 542819 276062 140956
296341 802378 165305 74568 15640 987110 423497 772419 394971 198761
293555 5524 14083 815646 198888 707017 711503 729172{-truncated-}
预期输出
374625
对于这个的完整输入数组数据,请点击此链接:Failed Test Case 2 Full Input
我快到了,但不知何故我很困惑为什么我的代码不适用于长输入数组元素。任何帮助将不胜感激,因为它会让我在未来的努力中学到新东西。
最佳答案
你误解了这个问题。如果您买不到任何键盘+USB,答案应该是-1。不是如果有一套买不起,而是如果它们都买不起。使用您当前的代码,如果最后一组无法负担,它会返回什么?
这是一个应该有效的代码。并评论说明:
int answer = -1; // that's the default answer.
int maxAmount = 0; // what if first keyboard + first usb are unaffordable? let's put it to 0
//This will compare the value of i+j throughout the loop and returns the max one
for(int i: keyboards){
for(int j: drives){
if((i+j) > b) {
// do nothing, it's unaffordable (and remove this block)
}else if((i+j) == b){
answer = i+j;
return answer;// it can't be more, stop the loop and return the solution
} else if((i+j) > maxAmount){ // no need to put an else, then an if both conditions are related
maxAmount = i+j;
answer = maxAmount;
}
}
}
当然,如果您从上面的代码中删除第一个空的 if
block ,您将不得不更改最后一个条件以检查它是否低于允许的最大值:
if((i+j)>maxAmount && (i+j)<=b)
关于java - 电子产品商店,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54312152/
Closed. This question needs to be more focused。它当前不接受答案。
如何在 C# 中对存储在 token 中的数字证书中的任何消息进行签名和验证?我已经完成了电子 token 证书的加密和解密。但没有找到任何签名和验证的解决方案。如果有人知道请回复,因为我已经尝试了很
我有以下 .svg 图形: 我正在尝试为电子设置动画,使其沿着圆环的曲率移动(滚动时与页面成比例)直到某个点(可能是电子翻转时电子所在的同一点)此图像的假想 x 轴): 我是网络开发的新手,所以我不确
我的问题是关于配置Cypress以启动某种语言的浏览器实例。 为了: 对本地化(i18n)文本标签进行断言? 检查i18n功能(在语言之间切换) 例如在以下情况下绕过持续集成(CI/CD)的问题: 在
所以我得到了 Retrofit API + Gson 作为转换器,我有 parcelable 类可以传递给各种 Activity ...... @Parcelize data class Generi
桌面应用程序的正确 oauth2 流程是什么?除了桌面应用程序之外,我还有一个使用隐式流的 SPA Web GUI。在那里,如果客户端在 3600 秒后重定向到 IdP 以颁发新的访问 token 并
任何人都可以建议为什么会出现此错误吗?谢谢! 电子(Chromium)开发者控制台出现此错误:“Uncaught SyntaxError:意外的保留字”并引用appentrypoint.js 在控制台
上下文:我有一个需要读取文件才能执行的应用程序ExternalApp.exe:File.ini。此文件包含ExternalApp.exe应用程序的配置,不可读。。解决方案:创建一个电子应用程序来读/写
上下文:我有一个需要读取文件才能执行的应用程序ExternalApp.exe:File.ini。此文件包含ExternalApp.exe应用程序的配置,不可读。。解决方案:创建一个电子应用程序来读/写
我是一名优秀的程序员,十分优秀!