题目 2702:蓝桥杯2022年第十三届决赛真题-内存空间(C/C++/Java组)

做这题没用啥算法,纯字符串处理,好在Java处理起字符串还算方便

输入会有6种类型:int、int[]、long、long[]、String、String[].

int占4Byte、long占8Byte、String占(s.length)Byte

选择使用 switch case 语句进行处理

对一行输入用空格分割,得到的第一个字符串就是类型

String[] sub_s = s.split(" ");    //分割后得到的第一个字符串就是数据类型
String type = sub_s[0];
  • int

输入的通式:int num1=1,num2=2,...,numN=N;

用逗号分割输入语句,得到几个字符串就是有几个int类型数据

String[] values_int = s.split(",");    //逗号分割出几个字符串就有几个int类型数据
long count_int = values_int.length;
return count_int*4;    //一个int占4Byte
  • int[]

输入的通式:int[] arr1=new int[size1],arr2=new int[size2],...,arrN=new int[sizeN];

用空格和逗号分割,得到的字符串数组中,下标为偶数的字符串中含有size

去除其中的多余字符就能得到size,转换成整数类型即可

String[] sub_int = s.split(" |,");    //用空格或逗号分割字符串
long count_int_arr = 0;
for(int i=2 ; i<sub_int.length ; i++) {    //分割后,偶数下标中含有 size
    if(i%2==0) {
        count_int_arr+= Integer.parseInt(sub_int[i].replace("int[","").replace("]", "").replace(";",""));    //提取size
    }
}
return count_int_arr*4;
  • long

同int

String[] values_long = s.split(",");    //逗号分割出几个字符串就有几个long类型数据
long count_long = values_long.length;
return count_long*8;
  • long[]

同int[]

String[] sub_long = s.split(" |,");    //用空格或逗号分割字符串
long count_long_arr = 0;
for(int i=2 ; i<sub_long.length ; i++) {    //分割后,偶数下标中含有 size
    if(i%2==0) {
        count_long_arr+= Integer.parseInt(sub_long[i].replace("long[","").replace("]", "").replace(";",""));    //提取size
    }
}
return count_long_arr*8;
  • String

输入通式:String s1="value1",s2="value2",...,sN="valueN";

去除首部"String "后,得到"s1="value1",s2="value2",...,sN="valueN";"

再用逗号分割,得到{"s1="value1"" , "s2="value2"" , ... , "sN="valueN";"}

对其中每一个字符串用空格分割,得到N个{"s" , ""value""},第N个为{"s" , ""value";"}

累加每个value字符串的长度,要减去N次双引号长度和一次末尾分号长度

String sub_String = s.replace("String ", "");    //"s1="value1",s2="value2",...,sN="valueN";"
String[] values_String = sub_String.split(",");    //{"s1="value1"" , "s2="value2"" , ... , "sN="valueN";"}
long count_String=0;
for(String sub_s : values_String) {
    String[] values = sub_s.split("=");    //{"s1" , ""value1""} ... {"sN" , ""valueN";"}
    count_String+=values[1].length();
    count_String-=2;    //去掉双引号的长度
}
return count_String-1;    //去掉最后分号的长度
  • String[]

同int[]

String[] sub_s_arr = s.split(" |,");    //用空格或逗号分割字符串
long count_string_arr = 0;                //分割后,偶数下标中含有 size
for(int i=2 ; i<sub_s_arr.length ; i++) {
    if(i%2==0) {
        count_string_arr+= Integer.parseInt(sub_s_arr[i].replace("String[","").replace("]", "").replace(";",""));    //提取size
    }
}
return count_string_arr;

输出部分,由于数量为0的单位不需要输出,故使用StringBuffer来组装结果

StringBuffer sb = new StringBuffer();
if(GB!=0)
    sb.append(GB).append("GB");
if(MB!=0)
    sb.append(MB).append("MB");
if(KB!=0)
    sb.append(KB).append("KB");
if(B!=0)
    sb.append(B).append("B");

完整代码

import java.util.Scanner;

public class MemorySpace {
    public static void main(String[] args) {
        //数据输入
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();        //数据行数
        sc.nextLine();                //抵消一个多余的回车
        String[] s = new String[T];
        for(int i=0 ; i<T ; i++) {
            s[i] = sc.nextLine();
        }
        sc.close();
        
        //数据处理
        long Byte_sum=0;
        for(int i=0 ; i<T ; i++) {
            Byte_sum += getMemory(s[i]);    //计算出总Byte数
        }
        
        //输出格式处理
        StringBuffer sb = new StringBuffer();
        
        long GB=Byte_sum/(1024*1024*1024);
        long MB=(Byte_sum-GB*1024*1024*1024)/(1024*1024);
        long KB=(Byte_sum-GB*1024*1024*1024-MB*1024*1024)/1024;
        long B=Byte_sum-GB*1024*1024*1024-MB*1024*1024-KB*1024;
        
        if(GB!=0)
            sb.append(GB).append("GB");
        if(MB!=0)
            sb.append(MB).append("MB");
        if(KB!=0)
            sb.append(KB).append("KB");
        if(B!=0)
            sb.append(B).append("B");
        
        //数据输出
        System.out.println(sb);    
    }
    
    public static long getMemory(String s) {
        String[] _type = s.split(" ");
        String type = _type[0];        //获取数据类型
        
        switch(type) {
        case "int" :
            String[] values_int = s.split(",");    //逗号分割出几个字符串就有几个int类型数据
            long count_int = values_int.length;
            return count_int*4;
            
        case "int[]" :
            String[] sub_int = s.split(" |,");    //用空格或逗号分割字符串
            long count_int_arr = 0;                //分割后,偶数下标中含有 size
            for(int i=2 ; i<sub_int.length ; i++) {
                if(i%2==0) {
                    count_int_arr+= Integer.parseInt(sub_int[i].replace("int[","").replace("]", "").replace(";",""));    //提取size
                }
            }
            return count_int_arr*4;
            
        case "long" :
            String[] values_long = s.split(",");    //逗号分割出几个字符串就有几个long类型数据
            long count_long = values_long.length;
            return count_long*8;
            
        case "long[]" :    
            String[] sub_long = s.split(" |,");    //用空格或逗号分割字符串
            long count_long_arr = 0;            //分割后,偶数下标中含有 size
            for(int i=2 ; i<sub_long.length ; i++) {
                if(i%2==0) {
                    count_long_arr+= Integer.parseInt(sub_long[i].replace("long[","").replace("]", "").replace(";",""));    //提取size
                }
            }
            return count_long_arr*8;
            
        case "String" :
            String sub_String = s.replace("String ", "");    //"s1="value1",s2="value2",...,sN="valueN";"
            String[] values_String = sub_String.split(",");    //{"s1="value1"" , "s2="value2"" , ... , "sN="valueN";"}
            long count_String=0;
            for(String sub_s : values_String) {
                String[] values = sub_s.split("=");    //{"s1" , ""value1""} ... {"sN" , ""valueN";"}
                count_String+=values[1].length();
                count_String-=2;    //去掉双引号的长度
            }
            return count_String-1;    //去掉最后分号的长度
            
        case "String[]" :
            String[] sub_s_arr = s.split(" |,");    //用空格或逗号分割字符串
            long count_string_arr = 0;                //分割后,偶数下标中含有 size
            for(int i=2 ; i<sub_s_arr.length ; i++) {
                if(i%2==0) {
                    count_string_arr+= Integer.parseInt(sub_s_arr[i].replace("String[","").replace("]", "").replace(";",""));    //提取size
                }
            }
            return count_string_arr;
        
        }
        
        return 0;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值