Java基础期中小结(二)

导弹防御系统

题目:某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。

每组输入有两行,第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。每组输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		int k = scan.nextInt();
		int[] a = new int[k];
		int[] b = new int[k];
		for(int i=0;i<k;i++) {
			a[i] = scan.nextInt();
			b[i] = 1;
		}
		//数组b用以记录,在b[i]之前的最多能拦截几个,初始化为1,拦截自己
		for(int i=0;i<k;i++) {
			for(int j=0;j<i;j++) {//对前面的进行循环统计
				if(a[j]>=a[i]) {//如果前面有比自己大的
					if(b[j]+1>b[i]) {//如果能够把前面的都加上
						b[i] = b[j]+1;//更新
					}else {
						b[i] = b[i];
					}
				}
			}
		}
		
		int max = b[0];
		for(int i=0;i<k;i++) {
			if(b[i]>max) {
				max = b[i];
			}
		}
		System.out.println(max);
	}

选美比赛

题目:在选美大奖赛的半决赛现场,有n名选手(2<n<100)参加比赛。比赛结束时,要在现场按照选手的出场顺序宣布最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不用考虑同名次的选手人数。如: 选手数量: 7 选手得分: 5,3,4,7,3,5,6宣布名次: 3,5,4,1,5,3,2 请编程帮助大奖赛组委会完成半决赛的评分排名工作。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int[] a = new int[n];//分数数组
		int[] b = new int[n];//名次数组
		int[] c = new int[110];//数组c用于判断是否有同样名次的人
		for(int i=0;i<n;i++) {
			a[i] = scan.nextInt();
			b[i] = 1;//首先认为自己是第一
		}
		for(int i=0;i<n;i++) {
			if(c[a[i]]==0) {//没有同样名次的人
				for(int j=0;j<i;j++) {//遍历前面的人
					if(a[j]>a[i]) {//前面的人分数比自己高
						b[i]++;//名次下降
					}else if(a[j]<a[i]){
						b[j]++;//否则对方名次下降
					}
				}
				c[a[i]]++;//已经有一个人是这个分数了
			}else {//有相同分数的人
				for(int k=0;k<i;k++) {
					if(a[k]==a[i]) {//找到前面相同分数的人
						b[i]=b[k];//同样的名次
						break;
					}
				}
			}			
		}
		
		for(int i=0;i<n;i++) {
			System.out.print(b[i]+" ");
		}
	}

子网判断

题目:子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。子网掩码与 IP 地址结构相同,是32 位二进制数,其中网络号部分全为 “1” 和主机号部分全为 “0” 。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP 地址分别与它们的子网掩码相 “与” 后的结果相同,则说明这两台主机在同一子网中。示例:IP 地址192.168.0.1子网掩码255.255.255.0转化为二进制进行运算:IP地址11010000.10101000.00000000.00000001子网掩码11111111.11111111.11111111.00000000 AND运算11010000.10101000.00000000.00000000转化为十进制后为:192.168.0.0 IP 地址 192.168.0.254子网掩码 255.255.255.0转化为二进制进行运算:IP地址11010000.10101000.00000000.11111110子网掩码11111111.11111111.11111111.00000000 AND运算11010000.10101000.00000000.00000000 转化为十进制后为:192.168.0.0 通过以上对两台计算机IP 地址与子网掩码的 AND 运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。

先后输入子网掩码、两个地址;得到计算结果,如不在同一子网,则输出0,否则输出1.

public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		String child = scan.nextLine().trim();
		String p1 = scan.nextLine().trim();
		String p2 = scan.nextLine().trim();
		scan.close();
    //根据 . 进行字符串分隔,注意split里用的是正则表达式,需要转义
		String[] childs = child.split("\\.");
		String[] p1s = p1.split("\\.");
		String[] p2s = p2.split("\\.");
		int i=0;
		
		out:
		for(i=0;i<4;i++) {
			int[] c = tobinary(childs[i]);
			int[] pa = tobinary(p1s[i]);
			int[] pb = tobinary(p2s[i]);
            //对于二进制数组一一对比
			for(int j=0;j<8;j++) {
				if((c[j]&pa[j])!=(c[j]&pb[j])) {
					System.out.println(0);break out;
                    //跳出外层循环
				}
			}
		}
		if(i==4) {
			System.out.println(1);
		}
		
	}
	//字符串转二进制整数型数组
	public static int[] tobinary(String s) {
        //将字符串转成数字再转成二进制字符串
		String a = Integer.toBinaryString(Integer.valueOf(s));
        //二进制字符串转成字符数组
		char[] as = a.toCharArray();
		int[] result = new int[8];
		for(int i=0;i<as.length;i++) {
			result[i] = as[i]-'0';
		}
		return result;
	}

密码检查

题目:第三个要求是不能有相同长度大于或等于2的子串重复

public static String ishas(String s) {
		for(int i=0;i<s.length()-2;i++) {
			String str1 = s.substring(i,i+2);
			String str2 = s.substring(i+2);
			if(str2.contains(str1)) {
				return "NG";
			}
		}
		return "OK";
	}

吸血鬼数字

题目:吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘得到,这对数字各包含乘积的一半位数的数字,数字选取后可任意排序,例如: 1260=21×60 1827=21×87 2187=27×81。写出一个程序,找出4位数的所有吸血鬼数字。

public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(int i=10;i<100;i++) {
			for(int j=i+1;j<100;j++) {
				int target = i*j;
				if(target<1000||target>9999) {
					continue;
				}
				
				int[] targetnum = {target/1000,target/100%10,target/10%10,target%10};
				int[] strnum = {i%10,i/10,j%10,j/10};
				Arrays.sort(targetnum);
				Arrays.sort(strnum);
                //通过判断排序后的数字是否相同来断定
				if(Arrays.equals(targetnum, strnum)) {
					System.out.print(i*j+" ");
				}
			}
		}
	}

骰子问题旋转

题目:骰子是个立方体每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态。放置在平面上用L表示向左翻转一次,用R表示向右翻转一次,用F表示向前翻转一次,用B表示向后翻转一次,用A表示逆时针旋转90度,用C表示顺时针旋转90度,现从初始状态开始,根据输入的动作序列,计算得到最终的状态。

输入只包含LRFBAC的字母序列,最大长度为50,可重复;输出经过一系列操作后的序列 注:按左右前后上下顺序输出。

如输入LB,输出5 6 1 2 3 4

public static int l = 1,r = 2,f = 3,b = 4,u = 5, d = 6;
//根据题意设置全局变量,左1,右2,前3,后4,上5,下6
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		String strs = scan.nextLine();
		scan.close();
		for(int i=0;i<strs.length();i++) {
			deal(strs.charAt(i));//对于每一步翻转进行操作
		}
		System.out.println(l+" "+r+" "+f+" "+b+" "+u+" "+d);
	}
	
	public static void deal(char c) {
		if(c=='C') {//顺时针旋转90° 上下不变 周围4个面交换
			int temp = l;
			l = f;//左边由前边代替
			f = r;//前边由右边代替
			r = b;//右边由后面代替
			b = temp;//后面由左边代替
		}else if(c=='A') {
			int temp = l;
			l = b;
			b = r;
			r = f;
			f = temp;
		}else if(c=='F') {
			int temp = f;
			f = u;
			u = b;
			b = d;
			d = temp;
		}else if(c=='B') {
			int temp = f;
			f = d;
			d = b;
			b = u;
			u = temp;
		}else if(c=='R') {
			int temp = u;
			u = l;
			l = d;
			d = r;
			r = temp;
		}else if(c=='L') {
			int temp = u;
			u = r;
			r = d;
			d = l;
			l = temp;
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章