题目一:
小知识:split分隔符总结:
1.字符"|","*","+"都得加上转义字符,前面加上"\\"。
2.而如果是"\",那么就得写成"\\\\"。(不过我看过有写成"\\"的)
3.如果一个字符串中有多个分隔符,可以用"|"作为连字符。
4.如果是""",就变成了"\""
package test;
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String[] ips = new String[4];
for (int i = 0; i < 4; i++) {
ips[i] = input.nextLine();
}
int ip1, ip2, ip3, ip4;
String[] tmp = new String[4];
for (int i = 0; i < 4; i++) {
tmp[i] = (ips[i].split("\\."))[0];
}
ip1 = Integer.parseInt(tmp[0]);
ip2 = Integer.parseInt(tmp[1]);
ip3 = Integer.parseInt(tmp[2]);
ip4 = Integer.parseInt(tmp[3]);
if (ip1 <= ip2) {
if ((ip3 < ip1 && ip4 < ip1) || ip3 > ip2 && ip4 > ip2) {
System.out.println("No Overlap IP");
} else {
System.out.println("Onverlap IP");
}
} else {
if ((ip3 < ip2 && ip4 < ip2) || (ip3 > ip1 && ip4 > ip1)) {
System.out.println("No Overlap IP");
} else {
System.out.println("Onverlap IP");
}
}
}
}
题目二:
- 例子:
-
第一个IP地址:
192.168.1.9
子网掩码:255.255.255.0
第二个ip地址:
192.168.1.10
子网掩码:255.255.255.0
-
将他们做与运算,首先要将十进制的ip地址转换为二进制的。
第一个IP地址:
11000000.10101000.00000001.00001001
子网掩码:11111111.11111111.11111111.00000000
第二个ip地址:
11000000.10101000.00000001.00001010
子网掩码:11111111.11111111.11111111.00000000
-
与运算结果:
11000000.10101000.00000001.00000000
他们得出来的结果是一样的,转换成十进制是:192.168.1.0。所以192.168.1.9和192.168.1.10
是在同一个网段中的。
小知识:sc.next() 和 sc.nextLine 的区别
两个都是用来接收用户的输入,区别在于:
next()从遇到第一个有效字符(非空格、换行符)开始扫描,遇到第一个分隔符或结束符(空格’ ‘或者换行符 ‘\n’)时结束。 nextLine()则是扫描剩下的所有字符串直到遇到换行符 ‘\n’为止。**
我们来举个例子,对于如下输入:
Scanner sc = new Scanner(System.in);
//加入输入的是:aaa bbb ccc
str1=sc.next();
//str1="aaa"
str2=sc.nextline();
//str2=" bbb ccc"
解释一下原因:
首先对于输入的数据,在计算机中实际表示是这样的,包含三个空格和一个换行符:
aaa bbb ccc \n
next()函数从遇到的第一个有效的字符a开始扫描,直到遇到第一个空格扫描结束,得到字符串”aaa”
nextLine()函数从空格开始扫描直到遇到\n符结束,故得到字符串是 ” bbb ccc”,注意这里bbb前面还有一个空格
所以如果要同时使用next()和nextLine()时,要慎用,因为联合使用时就是一个整体,next在前,nextLine靠后,扫描接受的是同一行上的字符串,只不过接收的是不同内容罢了。
题解:
package test;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
while (sc.hasNext()){
String s1=sc.next(),s2=sc.next(),s3=sc.next();
String[] s11=s1.split("\\."),s22=s2.split("\\."),s33=s3.split("\\.");
String s1133=new String(),s2233=new String();
for (int i = 0; i <s11.length; i++) { //结果存储
s1133+= yu(s11[i],s33[i])+".";
s2233+= yu(s22[i],s33[i])+".";
}
if (s1133.equals(s2233)) System.out.print(1+" "); //判断相等
else System.out.print(0+" ");
System.out.println(s1133.substring(0,s1133.length()-1));
}
}
public static int yu(String s1s,String s2s){ //字符串与
return Integer.parseInt(s1s)&Integer.parseInt(s2s);
}
}
题目三:
IP地址到整数之间的转换
题目:给定一个IP地址,例如:
一个ip地址为10.0.3.193
每段数字相对应的二进制数
10 00001010
0 00000000
3 00000011
193 11000001
组合起来即为:00001010 00000000 00000011 11000001,转换为10进制数就是:167773121,即该IP地址转换后的数字就是它了。
原理:ip地址的每段可以看成是一个0-255的整数,把每段拆分成一个二进制形式组合起来,然后把这个二进制数转变成
一个长整数。需要对IP地址进行校验。
输入描述:
输入
1 输入IP地址
2 输入10进制型的IP地址
输出描述:
输出
1 输出转换成10进制的IP地址
2 输出转换后的IP地址
输入例子:
10.0.3.193
167773121
输出例子:
167773121
10.3.3.193
小知识:java的int的取值范围
1、java中int的取值范围为-2147483648到+-2147483648。
2、首先jdk中定义int占4个字节32位,32位就是jvm仅仅给分配32个格子的空间,用以存放数据。
3、计算机中用0和1存放数据。那么,32个格子中放满0或1的方法,有2的32次方种。
4、但是java中int有正负之分,所以32个格子中占用一个格子标识正负,仅仅能用31个格子来标识数值。最后int能标识的最大/最小数字是:2的31次方即+/- 2147483648。取值范围即为二者之间。
package test;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String Ip=sc.next();
String inter=sc.next();
ipToInteger(Ip);
IntegerToIp(inter);
}
}
public static void ipToInteger(String Ip){
String[] ips=Ip.split("\\.");
int sum=0;
long inter=0;
if(ips.length!=4) {
} else {
for(int i=0;i<4;i++) {
sum=0;
for(int j=0;j<ips[i].length();j++) {
char ch=ips[i].charAt(j);
if('0'<=ch&&ch<='9') {
sum=10*sum+ch-'0';
}
}
inter=(inter<<8)+sum;
}
}
System.out.println(inter);
}
public static void IntegerToIp(String sinter){
StringBuffer ip=new StringBuffer();
long inter=Long.parseLong(sinter);
int[] ips=new int[4];
for(int i=0;i<4;i++){
int sum=(int) (inter & 255);
inter=inter>>8;
ips[3-i]=sum;
}
for(int i=0;i<4;i++){
if(i!=3)
System.out.print(ips[i]+".");
else
System.out.println(ips[i]);
}
}
}
题目四:
如何判断一个IP地址是否合法?
题目:判断输入的字符串是不是一个有效的IP地址
package test;
import java.util.*;
public class Main {
public static void main(String [] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()) {
String str=sc.next();
String[] array=str.split("\\.");
int count=0;
for(int i=0;i<array.length;i++) {
int p=Integer.parseInt(array[i]);
if(p>=0&&p<=255) {
count+=1;
}
}
if(count==4) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
}