UVa 1596 - Bug Hunt

输入一段程序代码,要你找出bug,有两种bug,一是引用未赋值变量,二是下标越界。

思路:有两个map,一个用来记录每个元素对应的值,map<元素,值>,例如a[0]=>1,a[2]=>3,b[2]=>12之类的,前面的a[0],a[2],b[2]就是map的key,而值就是value

另外一个用来记录数组大小,形式是map2<a[,12>,其中a[表明是数组a,12是指大小

首先是声明数组,例如a[9]

我们切割字符串,取出a[,取出9,将两个构成键值对,存入map2中,于是其中就有a[=>9,说明了a数组的大小

然后是赋值语句,例如a[0]=1

首先根据等号切割,然后使用一个getvalue()函数,这个函数可以获取值(如果是整数,就返回整数本身,如果是元素,就查找map表,返回对应的值)

右边直接使用getvalue()就可以了,左边要先切割字符串,取出a[,然后用getvalue()获取对应0的值,当然0只是一个例子,它也可以是更复杂的元素嵌套,但是我们在可以在getvalue里面使用递归解决

在getvalue中我们要判断是否越界,这个越界判断只要跟map2比较就好了

如果没有越界,右边就是要赋的值

左边会得到a[0..9]的形式(也就是去除了嵌套)

最后将a[0..9]和值作为键值对加入map

package test;

import java.util.HashMap;
import java.util.Scanner;



public class Test{
	static HashMap<String,Integer> map = new HashMap<String,Integer>();//记录a[0..9]对应的值
	static HashMap<String,Integer> map2 = new HashMap<String,Integer>();//记录a[]数组的大小
	
	static Integer getValue(String s){//获取值
		if(s.indexOf("[")==-1){//如果是数字,直接返回数字		
			return Integer.valueOf(s);
		}
		//不是数字,说明是数组形式
		String s0 = s.substring(0, s.indexOf("[")+1);//获取数组的标记a[
		String s1 = s.substring(s.indexOf("[")+1,s.lastIndexOf("]"));//获取index
		
		if(s1.indexOf("[")==-1){//如果index为数字,说明s是a[0..9]的形式
			if(map2.get(s0)==null || map2.get(s0)<=Integer.valueOf(s1)){//s1是否溢出
				System.out.println("下标溢出");
				System.exit(0);
			}
				
			if(map.get(s0+s1+"]")!=null){//是否初始化变量
				return map.get(s0+s1+"]");
			}else{
				System.out.println("该值未初始化");
				System.exit(0);
			}
		}else{//s是嵌套形式a[a[a[0...9]]]..
			int index = getValue(s1);//递归获取
			if(map2.get(s0)==null || map2.get(s0)<=Integer.valueOf(index)){//检查是否溢出
				System.out.println("下标溢出");
				System.exit(0);
			}
			if(map.get(s0+index+"]")!=null){
				return map.get(s0+index+"]");
			}else{
				System.out.println("该值未初始化");
				System.exit(0);
			}
		}		
		return null;	
	}
	
	static void getArr(String s){//记录数组和其大小
		map2.put(s.substring(0, s.indexOf("[")+1),
				Integer.valueOf(s.substring(s.indexOf("[")+1,s.indexOf("]"))));	
	}
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String line;
		while(!"end".equals((line=scanner.nextLine()))){
			if(line.indexOf("=")==-1){//说明是a[0..9]形式的数组声明
				getArr(line);				
			}else{//说明是赋值
				String ss = line.substring(0,line.indexOf("="));//根据等号切割
				String s0 = line.substring(0,ss.indexOf("[")+1);
				String s2 = line.substring(ss.indexOf("[")+1,ss.lastIndexOf("]"));
				
				String s1 = line.substring(line.indexOf("=")+1);
				
				if(map2.get(s0)==null || map2.get(s0)<=getValue(s2)){
					System.out.println("下标溢出");
					System.exit(0);
				}
				
				map.put(s0+getValue(s2)+"]",getValue(s1));								
			}
			System.out.println(map);
			System.out.println(map2);
		}
		scanner.close();
	}          
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值