解题思路:我将这个文本分开处理,func1处理数组类定义语句,func2处理普通定义语句,calc负责计算内存。主要就是通过截取字符串来判断占用内存。然后我自己找不出来我到底哪里出错了?一直报错,没成功。 我基本都注释了,你们java的可以帮我跑一下测试一下吗? 也提供个思路
注意事项:大家讨论一下
参考代码:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
// 存放类型的字符数组,根据输入的行数定义长度
String[] arrs = new String[t];
// 存放总共占用的字节数
int memory_sum = 0;
int index = 0;
//将每条定义语句全部放入字符数组中,备用
while(t-- > 0) {
arrs[index] = scanner.next();
index ++;
}
// 遍历处理每条字符定义语句
for (String s_element: arrs) {
// 判断到是数组定义语句就讲此定义字符串传给方法一,否则方法二。
if(s_element.contains("[]")) {
memory_sum += func1(s_element);
}else {
memory_sum += func2(s_element);
}
}
System.out.println(calc(memory_sum));
}
// 处理数组定义类型
public static int func1(String str) {
// 这个len即每个变量占用的字节空间大小,截取首字符是i即可判断是int4个字节;
// 否则就是long,8个字节
int len;
if(str.subSequence(0, 1).equals("i")) len = 4;
else len = 8;
// 先将定义字符串的“type[]”部分截除,备用。
String sub = str.substring(str.indexOf(" ") + 1,str.lastIndexOf(";"));
// 通过逗号将字符串分隔成新的字符串数组
String[] str_arr = sub.split(",");
int sumNum = 0;
// 该部分内存占用量
int part_memory = 0;
// 遍历新字符数组中的[]中间的字符串数字,并将其转换为数字类型累加后 * len
for (String s : str_arr) {
String midStrNum = s.substring(s.indexOf("[") + 1,s.lastIndexOf("]"));
sumNum += Integer.parseInt(midStrNum);
part_memory += len * sumNum;
}
return part_memory;// 将这条定义语句所包含信息占用的内存数返回
}
// 处理普通定义类型
public static int func2(String str) {
int len;
String first = str.substring(0,1);
if(first.equals("i")) len = 4;
else if(first.equals("l"))len = 8;
else len = 1;
int count = 1;// 代表定义的变量的个数,默认一个变量
// 字符数组中有一个逗号代表这条定义语句中有两个元素
for (char c:str.toCharArray()) {
if(c == ',') count ++;
}
// 如果是int类型或者是long类型直接返回占用内存空间的字节数
if(len == 4 || len == 8) {
return len * count;
}else {
// 如果是String类型的变量定义就进行处理
String[] str_arr = str.split(",");
// 用来存放引号中的空字符串
String newStr = "";
for (String s : str_arr) {
// 将找到的每个子串中引号内的部分连接到newStr形成新的字符串
newStr += s.substring(s.indexOf("\"") + 1,s.lastIndexOf("\""));
}
return newStr.length() * len;
}
}
// 计算内存,进行换算
public static String calc(int num) {
int n = num;
int a,b,c,d;
a = n/1024/1024/1024;
b = n% (int)Math.pow(2, 30) / (int)Math.pow(2,20);
c = n%1024%1024/1024;
d = n % 1024;
String ans = (a != 0 ? a + "GB" : "") + (b != 0 ? b + "MB" : "")
+ (c != 0 ? c + "KB": "") + (d != 0 ? d + "B" : "");
return ans;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复