判斷ip地址是否合法(美團2024屆秋招筆試第三場程式設計真題)

athenanevergiveup發表於2024-04-02

核心思想

大模擬 -。-,還是不夠細心,面向樣例程式設計,一路錯過去的。
寫得太醜了 湊合看吧。

程式碼

import java.util.*;

public class Main {
    public static void main(String[] args) {
        final long MOD = (long) (1e9 + 7);
        Scanner scanner = new Scanner(System.in);

        String s = scanner.nextLine();
        String[] split = s.split("\\.");
        boolean flag = true;
        //開頭結尾必須是數字
        if(s.charAt(0) < '0' || s.charAt(0) > '9' ||
                s.charAt(s.length() - 1) < '0' || s.charAt(s.length() - 1) > '9')
            flag = false;
        //拆分後的陣列長度為4
        if (split.length != 4)
            flag = false;
        if(!flag){
            System.out.println("invalid");
            return;
        }
        // 將ip轉換為數字
        int[] nums = new int[4];
        int idx = 0;
        for (String sp : split) {
            int cur = 0;
            char[] chs = sp.toCharArray();
            // 前導0 注意1.0.0.0 這樣是允許的 要結合size判斷 || 1.0..0 這樣的陣列長度也是4
            if((sp.startsWith("0") && sp.length() !=1) || chs.length == 0){
                flag = false;
                break;
            }
            // 必須是數字
            for (char ch : chs) {
                if(ch < '0' || ch > '9'){
                    flag = false;
                    break;
                }
                else
                    cur = cur * 10 + ch - '0';
            }
            nums[idx++] = cur;
        }
        if(!flag){
            System.out.println("invalid");
            return;
        }
        if(!check(nums, 0, 255, 0, 255, 0, 255, 0, 255)){
            System.out.println("invalid");
        }
        else if(check(nums, 1, 126, 0, 0, 0, 0, 0, 0)){
            System.out.println("A_address");
        }
        else if(check(nums, 128, 191, 0, 255, 0, 255, 0, 255)){
            System.out.println("B_address");
        }
        else if(check(nums, 192, 223, 0, 255, 0, 255, 0, 255)){
            System.out.println("C_address");
        }
        else
            System.out.println("other");
    }

    static boolean check(int[] nums,int s0, int e0, int s1, int e1, int s2, int e2, int s3, int e3){
        // A類地址 第一位不是126時範圍變化一下 我傳入的start 和 end 都是0
        if(nums[0] != 126){
            e1 = e2 = e3 = 255;
        }
        if(nums[0] < s0 || nums[0] > e0)
            return  false;
        if(nums[1] < s1 || nums[1] > e1)
            return  false;
        if(nums[2] < s2 || nums[2] > e2)
            return  false;
        if(nums[3] < s3 || nums[3] > e3)
            return  false;
        return true;
    }
}

相關文章