

做这题没用啥算法,纯字符串处理,好在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;
}
}
