解题思路:我将这个文本分开处理,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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复