题目:
ipv7 转 10进制输出,不能调特殊的ip转换库函数:
1.0.0.0.0.0.2 => 281474976710658
1.0.....2 => 281474976710658
# 中间的0可以进行压缩表示, 但是首位的不能压缩
某个位上不能0开头如:
1.013.1.0...2 => -1
某个位上值需要在0-255之间 否则返回 -1
1.258.1.1.1.1.2 => -1
错误就输入-1
需要注意测试用例可能包含:
1.&.0.0.0.0.1 # 含有其他符号,返回-1
代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true){
String str = scanner.nextLine();
System.out.println(trans(str));
}
}
static Long trans(String str){
// 首位不是 0 - 9 直接返回 -1
char firstC = str.charAt(0);
char lastC = str.charAt(str.length() - 1);
if(firstC > '9' || firstC < '0'){
return -1L;
}
if(lastC > '9' || lastC < '0'){
return -1L;
}
// 按照'.'拆分 并且检查有无特殊字符
int numberOfPoint = 0; // 统计几个点
char cur;
StringBuilder sb = new StringBuilder();
int k = 0;
String[] split = new String[100]; // 保存划分出来的每一位置上的String类型的数字
for(int i = 0; i < str.length(); i++){
cur = str.charAt(i);
// 判断当前位置是不是特殊字符 是的话直接返回 -1
if((cur >= '0' && cur <= '9') || cur == '.'){
// 如果当前为 是 '.' 则判上一位是不是也是'.' 如果也是点,就补一个0;
if(cur == '.' ){
if(str.charAt(i - 1) == '.') sb.append(0);
split[k++] = sb.toString();
sb = new StringBuilder();
numberOfPoint++;
}else{
sb.append(cur);
}
}else {
return -1L;
}
}
split[k++] = sb.toString();
if(numberOfPoint != 6){
// 不是6个点的话有问题,直接返回-1
return -1L;
}
int[] numbers = new int[7];
for(int i = 0; i < 7; i++){
// 如果 该数字长度大于1 又以 0开头,则有问题, 如 017 或者 000
if((split[i].length() > 1 && split[i].charAt(0) == '0') || split[i].length() > 3){
// 长度大于3的数字肯定大于255 直接返回-1,否则可能出现个特别大的数字,导致转换函数出问题
return -1L;
}
numbers[i] = Integer.parseInt(split[i]);
if (numbers[i] > 255) {
return -1L;
}
}
Long[] map = new Long[]{
// 1L << (8 * 6) 等价 Math.pow(256, 6)
// 但是Math输入和返回值都是float
1L << (8 * 6),
1L << (8 * 5),
1L << (8 * 4),
1L << (8 * 3),
1L << (8 * 2),
1L << (8 * 1),
1L << (8 * 0),
};
Long res = 0L;
for(int i = 0; i < numbers.length; i++){
res += numbers[i] * map[i];
}
return res;
}
}
更新
发现大问题了 刚开始用spelit分割点,str.split(".")
一直分割不成功 忘记需要转义了 哎!!
所以需要注意类似这种
public class Main {
public static void main(String[] args){
String s = "xxx\\xxx.xxx[xxx(xxx{xxx";
// 以 \\ 分割
String[] split = s.split("\\\\");
for (String s1 : split) {
System.out.print(s1 + " ");
}
System.out.println();
// 以 . 分割
split = s.split("\\.");
for (String s1 : split) {
System.out.print(s1 + " ");
}
System.out.println();
// 以 [ 括号分割
split = s.split("\\[");
for (String s1 : split) {
System.out.print(s1 + " ");
}
}
}
================输出结果====================
xxx xxx.xxx[xxx(xxx{xxx
xxx\xxx xxx[xxx(xxx{xxx
xxx\xxx.xxx xxx(xxx{xxx
Process finished with exit code 0