菜狗


私信TA

用户名:dotcpp0661016

访问量:329

签 名:

keep smiling,never give up.

等  级
排  名 40211
经  验 334
参赛次数 0
文章发表 3
年  龄 0
在职情况 学生
学  校 B站大学
专  业 CS

  自我简介:

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

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

scanner.next() 读到空格立即停止读入
2023-04-07 12:06:13
  • «
  • 1
  • »