解题思路:我将这个文本分开处理,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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

迷你滨 1年前 回复TA
scanner.next() 读到空格立即停止读入