昨天刷oj,遇到的一个小题,还是一如既往的一脸懵逼,不怕,先把输入输出写出来,顺便学习了下ipv6的相关知识。嗯,做出来感觉也不难,思路就是先创建一个完整的v6串,以“:”分割成数组成员个数为8的String数组A,每个索引中的串暂时都是“0000”,
再把输入的串以“:”分割成 字符串数组B,然后从右向左遍历,把A[?]=B[?],若A[?]长度不足4,则往前补“0”, 当成员为“ ”时,说明遇到了::部分,break;
再从左向右来一遍,重复上述操作,最后把A数组整成ipv6的形式就ok了,说的啰嗦,帮助理解代码就可以了。
当然了,还是通不过oj,我也是醉了。郁闷!!!
题目描述:
Z镇的恒恒有着各种各样的机器人。为了控制所有的机器人,恒恒托别人造了一个“万能遥控器”。只要往遥控器输入一个机器人的编号,就能遥控这个机器人了。可是有一天,恒恒发现他的机器人实在太多了(而且还越来越多), 以至于使用IPV4协议都不够他唯一地标记每一个机器人。后来,恒恒听说IPV6协议拥有近无穷个地址,于是他就想用IPV6协议来为机器人编号。不过,完整的ipv6地址很长(有39个字符),手工输入很费时间,所以IPV6有一套简化的机制。现在,恒恒给了你一些IPV6地址,请你编写程序,将它们转换为完整的地址吧!
IPV6的地址定义如下(摘抄自《IPv6技术白皮书》3.3.3):
“IPv6的地址有128位,是以16位为一分组,每个16位分组写成4个十六进制数,中间用冒号分隔,称为冒号分十六进制格式。例如:
21DA:00D3:0000:2F3B:02AA:00FF:FE28:9C5A是一个完整的IPV6地址。
Ipv6地址中每个16位分组中的前导零位可以去除做简化表示,但每个分组必须至少保留一个数字。如上例中的地址,去除前导零位后写成:
21DA:D3:0:2F3B:02AA:00FF:FE28:9C5A
某些地址中可能包含很长的零序列,为进一步简化表示法,还可以将冒号十六进制格式中相邻的连续零位合并,用双冒号“::“表示。“::”符号在一个地址中只能出现一次,该符号也能用来压缩地址中前部和尾部的相邻的连续零位。例如地址“1080:0:0:0:8:800:200C:417A,0:0:0:0:0:0:0:1,0:0:0:0:0:0:0:0分别可以表示为压缩格式1080::8:800:200C:417A,::1,::”。
输入:
第一行为一个正整数n,表示接下来将有n个地址。
接下来n行,每行一个非空字符串,表示一个地址。
输出:
一共n行,每行一个字符串。对每个输入的字符串,如果符合IPv6标准,则输出其对应的完整的IPv6地址。否则,输出INVALID。
样例输入
4
1080::8:800:200C:417A
::1
::
1234567890ABCDEF
样例输出
1080:0000:0000:0000:0008:0800:200C:417A
0000:0000:0000:0000:0000:0000:0000:0001
0000:0000:0000:0000:0000:0000:0000:0000
INVALID
import java.util.Scanner;
/**
* 万能遥控器
*
* @author 猴子哥哥
* @date 2019年1月23日
*/
public class Main019 {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
if (n == 0) {
System.exit(0);
}
String[] strs = new String[n];
for (int i = 0; i < n; i++) {
strs[i] = scanner.next();
}
for (int i = 0; i < strs.length; i++) {
System.out.println(count(strs[i]));
}
}
}
private static String count(String string) {
if (!string.contains(":") || string.contains(":::")) {
return "INVALID";
}
String original = "0000:0000:0000:0000:0000:0000:0000:0000";
String[] originalArr = original.split(":");
int index = 7;
String[] strarr = string.split("\\:", 8);// 注意不能用split(":"),会导致分割丢失
for (int i = strarr.length - 1; i >= 0; i--) {
if (strarr[i].equals("") || strarr[i].contains(":")) {
break;
}
originalArr[index] = strarr[i];
if (originalArr[index].length() != 4) {
for (int j = 0; j < 4 - strarr[i].length(); j++) {
originalArr[index] = "0" + originalArr[index];
}
}
index--;
}
index = 0;
for (int j = 0; j < strarr.length; j++) {
if (strarr[j].equals("") || strarr[j].contains(":")) {
break;
}
originalArr[index] = strarr[j];
if (originalArr[index].length() != 4) {
for (int z = 0; z < 4 - strarr[j].length(); z++) {
originalArr[index] = "0" + originalArr[index];
}
}
index++;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < originalArr.length; i++) {
if (i == originalArr.length - 1) {
sb.append(originalArr[i]);
} else {
sb.append(originalArr[i] + ":");
}
}
return sb.toString();
}
}