導彈防禦系統
題目:某國爲了防禦敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲,並觀測到導彈依次飛來的高度,請計算這套系統最多能攔截多少導彈。攔截來襲導彈時,必須按來襲導彈襲擊的時間順序,不允許先攔截後面的導彈,再攔截前面的導彈。
每組輸入有兩行,第一行,輸入雷達捕捉到的敵國導彈的數量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;
}
}