1024: 万能遥控器

昨天刷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();
	}

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值