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