当前位置:   article > 正文

华为OD机考算法题:区块链文件转储系统_华为od 磁盘转存,找出连续的文件,使文件的大小之和不高于转寸磁盘的大小

华为od 磁盘转存,找出连续的文件,使文件的大小之和不高于转寸磁盘的大小

目录

题目部分

解读与分析

代码实现


题目部分

题目区块链文件转储系统
难度
题目说明区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1、F2……Fn。随着时间的推移,所占存储会越来越大。
云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转的文件之和不能超过SATA盘的容量。
假设每块SATA盘容量为 M,求能转储的最大连续文件之和。
输入描述第一行为 SATA 盘的容量 M, 1000 <= M <= 1000000。
第二行为区块链文件大小序列 F1、F2、F3 …… Fn。其中 1 <= n <= 100000,1 <= Fi <= 500。
输出描述求能存储的最大连续文件大小之和。
补充说明
------------------------------------------------------
示例
示例1
输入1000
100 300 500 400 400 150 100
输出950
说明最大序列和为 950,序列为 [ 400, 400, 150 ]。
示例2
输入1000
100 500 400 150 500 100
输出1000
说明最大序列和为 1000,序列为 [ 100, 500, 400 ]。


解读与分析

题目解读

磁盘转存,找出连续的文件,使文件的大小之和不高于转寸磁盘的大小,求最大的文件大小之和。翻译一下,就是:从一组连续的正整数中,找出连续的数字,使连续数字之和不超过指定数字。在符合条件的情况下,连续数字之和最大是多少。

分析与思路

此题与《华为OD机考算法题:补种未成活胡杨》类似,都是以 0 为左边界,找到一个右边界,使左边界和右边界之间的所有数字符合其条件,然后依次向右移动左边界、右边界,找到下一个符合条件的连续块,逐一比较每个连续块的情况,最终输出符合条件连续块中最优(最优的条件取决于题目要求)的那个。

此题的时间复杂度为 O(n),空间复杂度为 O(1)。


代码实现

Java代码

  1. import java.util.Scanner;
  2. /**
  3. * 区块链文件转储系统
  4. *
  5. * @since 2023.09.22
  6. * @version 0.1
  7. * @author Frank
  8. *
  9. */
  10. public class StorageTransfer {
  11. public static void main(String[] args) {
  12. Scanner sc = new Scanner(System.in);
  13. while (sc.hasNext()) {
  14. String input = sc.nextLine();
  15. int limit = Integer.parseInt(input);
  16. input = sc.nextLine();
  17. String[] strNumbers = input.split(" ");
  18. processStorageTransfer(limit, strNumbers);
  19. }
  20. }
  21. private static void processStorageTransfer(int limit, String strNumbers[]) {
  22. int[] numbers = new int[ strNumbers.length ];
  23. for( int i = 0; i < strNumbers.length; i ++ )
  24. {
  25. numbers[i] = Integer.parseInt( strNumbers[i] );
  26. }
  27. int left = 0;
  28. int right = 1;
  29. int tmpMax = numbers[0];
  30. int maxSize = 0;
  31. while( right <= numbers.length )
  32. {
  33. while( ( right < numbers.length ) && ( tmpMax + numbers[right] <= limit ) )
  34. {
  35. tmpMax += numbers[right];
  36. right ++;
  37. }
  38. if( tmpMax > maxSize )
  39. {
  40. maxSize = tmpMax;
  41. }
  42. if( maxSize == limit )
  43. {
  44. System.out.println( maxSize );
  45. return;
  46. }
  47. if( right >= numbers.length )
  48. {
  49. break;
  50. }
  51. do {
  52. tmpMax -= numbers[left];
  53. left ++;
  54. }while( left < numbers.length && tmpMax > limit);
  55. }
  56. System.out.println( maxSize );
  57. }
  58. }

JavaScript代码

  1. const rl = require("readline").createInterface({ input: process.stdin });
  2. var iter = rl[Symbol.asyncIterator]();
  3. const readline = async () => (await iter.next()).value;
  4. void async function() {
  5. while (line = await readline()) {
  6. var limit = parseInt(line);
  7. line = await readline();
  8. var strNumbers = line.split(" ");
  9. processStorageTransfer(limit, strNumbers);
  10. }
  11. }();
  12. function processStorageTransfer(limit, strNumbers) {
  13. var numbers = new Array();
  14. for (var i = 0; i < strNumbers.length; i++) {
  15. numbers[i] = parseInt(strNumbers[i]);
  16. }
  17. var left = 0;
  18. var right = 1;
  19. var tmpMax = numbers[0];
  20. var maxSize = 0;
  21. while (right <= numbers.length) {
  22. while ((right < numbers.length) && (tmpMax + numbers[right] <= limit)) {
  23. tmpMax += numbers[right];
  24. right++;
  25. }
  26. if (tmpMax > maxSize) {
  27. maxSize = tmpMax;
  28. }
  29. if (maxSize == limit) {
  30. console.log(maxSize);
  31. return;
  32. }
  33. if (right >= numbers.length) {
  34. break;
  35. }
  36. do {
  37. tmpMax -= numbers[left];
  38. left++;
  39. } while (left < numbers.length && tmpMax > limit);
  40. }
  41. console.log(maxSize);
  42. }

(完)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/311341
推荐阅读
相关标签
  

闽ICP备14008679号