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;
		}
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章