ファーウェイインタビュー手引きリアル質問【ipv4アドレスかipv6アドレスか判断】

        入力文字列が有効な IPv4 または IPv6 アドレスであることを確認する関数を作成します。

IPv4 アドレスは10 進数とドットで表され、各アドレスには0 から 255 までの 4 つの 10 進数が (".") で区切られて含まれます。たとえば、172.16.254.1;

        同時に、IPv4 アドレスの数字は 0 から始まりません。たとえば、アドレス 172.16.254.01 は不正です。

IPv6 アドレスは16 進数の 8 つのグループで表され、各グループは 16 ビットを表します。これらの数字のグループは (":") で区切られますたとえば、2001:0db8:85a3:0000:0000:8a2e:0370:7334 は有効なアドレスです。さらに、0 で始まるいくつかの数字を追加することができ、文字は大文字または小文字にすることができますしたがって、2001:db8:85a3:0:0:8A2E:0370:7334 も有効な IPv6 アドレスです (つまり、先頭の 0 を無視し、大文字と小文字を区別しません)。

        ただし、グループの値が 0 であるため、空のグループを使用することはできず、(::) 状況が発生しますたとえば、2001:0db8:85a3::8A2E:0370:7334 は無効な IPv6 アドレスです。同時に、IPv6 アドレスでは冗長な 0 は許可されません。たとえば、02001:0db8:85a3:0000:0000:8a2e:0370:7334 は無効です。

説明: 指定されたストリングにスペースやその他の特殊文字が含まれていないと想定できます。

例 1:

入力: 「172.16.254.1」

出力: 「IPv4」

説明: これは有効な IPv4 アドレスであるため、「IPv4」が返されます。
例 2:

入力: "2001:0db8:85a3:0:0:8A2E:0370:7334"

出力: 「IPv6」

説明: これは有効な IPv6 アドレスであるため、「IPv6」が返されます。
例 3:

入力: 「256.256.256.256」

出力: 「どちらでもない」

説明: このアドレスは、IPv4 アドレスでも IPv6 アドレスでもありません。

テストは、詳細を理解し、処理する能力です。468. IP アドレスの確認 - LeetCode

IPv4 の判定では、IPv4 の異なる部分が「.」で区切られ、IPv4 の異なるセグメントがインターセプトされ、これらの異なる部分の判定が行われます。

先頭に 0 を付けることはできません
空にすることはできません
整数に変換することはできません 255 を超えることはでき
ません 4 つの段落のみを含める
ことができます 他の文字を含めることはできません


IPv6の判定:

空にすることはできません、
パーツのサイズを 4 より大きくすることはできません、
セグメントは 8 つしか使用できませ
ん 、その他の文字は使用できません
大文字と小文字の範囲に 'a'~'f' がさらにあります オプション

コードは Leetcode からのものです

import java.util.Scanner;
import java.util.*;
import java.util.stream.Collectors;
 
public class Main{
    public static void main (String[] args) {
        Scanner in = new Scanner(System.in);
        String input_str=in.nextLine();
        System.out.println(validIPAddress(input_str));
        return;
    }

    public static String validIPAddress(String queryIP) {
        if (queryIP.indexOf('.') >= 0) {
            return isIpV4(queryIP) ? "IPv4" : "Neither";
        } else {
            return isIpV6(queryIP) ? "IPv6" : "Neither";
        }
    }

    public static boolean isIpV4(String queryIP) {
        //加-1是防止出现空字符串无法计数 比如192.168.1.1. 后边多了一个点,不加-1会被忽略后边的空串
        String[] split = queryIP.split("\\.",-1);
        //个数不是4个
        if (split.length != 4) {
            return false;
        }
        for (String s : split) {
            //每个长度不在 1-3之间
            if (s.length() > 3 || s.length() == 0) {
                return false;
            }
            //有前导0 并且长度不为1
            if (s.charAt(0) == '0' && s.length() != 1) {
                return false;
            }
            //计算数字
            int ans = 0;
            for (int j = 0; j < s.length(); j++) {
                char c = s.charAt(j);
                //不是数字
                if (!Character.isDigit(c)) {
                    return false;
                }
                ans = ans * 10 + (c - '0');
            }
            //数字超过255
            if (ans > 255) {
                return false;
            }
        }
        return true;
    }

    public static boolean isIpV6(String queryIP) {
        String[] split = queryIP.split(":",-1);
        //数量不是8个
        if (split.length != 8) {
            return false;
        }
        for (String s : split) {
            //每个串 长度不在1-4之间
            if (s.length() > 4 || s.length() == 0) {
                return false;
            }
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                //不是数字并且字母不在 a-f之间
                if (!Character.isDigit(c) && !(Character.toLowerCase(c) >= 'a') || !(Character.toLowerCase(c) <= 'f')) {
                    return false;
                }
            }
        }
        return true;
    }
 
}

おすすめ

転載: blog.csdn.net/misayaaaaa/article/details/130418728