สมมติว่าเรามีสตริง เราต้องตรวจสอบว่าข้อมูลที่ป้อนนั้นเป็นที่อยู่ IPv4 ที่ถูกต้องหรือที่อยู่ IPv6 หรือไม่
ที่อยู่ IPv4 จะแสดงตามรูปแบบบัญญัติในรูปแบบจุดทศนิยม ซึ่งประกอบด้วยตัวเลขทศนิยมสี่ตัว แต่ละตัวมีค่าตั้งแต่ 0 ถึง 255 คั่นด้วยจุด ("") ตัวอย่างเช่น 192.168.254.1; นอกจากนี้ เลขศูนย์นำหน้าในที่อยู่ IPv4 นั้นไม่ถูกต้อง ตัวอย่างเช่น ที่อยู่ 192.168.254.01 ไม่ถูกต้อง
ที่อยู่ IPv6 จะแสดงเป็นกลุ่มแปดกลุ่มที่มีเลขฐานสิบหกสี่หลัก โดยแต่ละกลุ่มจะแทน 16 บิต กลุ่มจะถูกคั่นด้วยเครื่องหมายทวิภาค (":") ตัวอย่างเช่น สมมติว่าที่อยู่คือ 2001:0db8:85a3:0000:0000:8a2e:0370:7334 เป็นที่อยู่ที่ถูกต้อง นอกจากนี้ เราสามารถละเว้นเลขศูนย์นำหน้าบางส่วนในเลขฐานสิบหกสี่หลักและอักขระตัวพิมพ์เล็กบางตัวในที่อยู่เป็นตัวพิมพ์ใหญ่ ดังนั้น 2001:db8:85a3:0:0:8A2E:0370:7334 ที่อยู่นี้ก็ใช้ได้เช่นกัน
อย่างไรก็ตาม เราไม่แทนที่กลุ่มค่าศูนย์ที่ต่อเนื่องกันด้วยกลุ่มว่างกลุ่มเดียวโดยใช้เครื่องหมายทวิภาคสองตัว (::) ที่ต่อเนื่องกันเพื่อไล่ตามความเรียบง่าย ตัวอย่างเช่น 2001:0db8:85a3::8A2E:0370:7334 เป็นที่อยู่ IPv6 ที่ไม่ถูกต้อง นอกจากนี้ ศูนย์นำหน้าพิเศษใน IPv6 ก็ไม่ถูกต้องเช่นกัน ที่อยู่ 02001:0db8:85a3:0000:0000:8a2e:0370:7334 ไม่ถูกต้อง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดเมธอด checkv4(x) วิธีนี้จะตรวจสอบว่า x อยู่ในช่วง 0 ถึง 255 หรือไม่ จากนั้นเป็นจริง มิฉะนั้นจะเป็นเท็จ
-
กำหนดวิธีการ checkv6(x) ซึ่งจะทำงานดังนี้ -
-
ถ้าขนาด x> 4 ให้คืนค่าเท็จ
-
หากค่าทศนิยมของ x>=0 และ x[0] ไม่ใช่ '-' ให้คืนค่า จริง มิฉะนั้น เท็จ
-
-
จากวิธีหลัก
-
หากอินพุตมีสามจุด และสำหรับแต่ละส่วน ฉัน checkv4(i) เป็นจริง จากนั้นส่งคืน “IPv4”
-
หากอินพุตมีโคลอนเจ็ดตัว และสำหรับแต่ละส่วน ฉัน checkv6(i) เป็นจริง จากนั้นส่งคืน “IPv6”
ตัวอย่าง (Python)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class Solution(object): def validIPAddress(self, IP): """ :type IP: str :rtype: str """ def isIPv4(s): try: return str(int(s)) == s and 0 <= int(s) <= 255 except: return False def isIPv6(s): if len(s) > 4: return False try : return int(s, 16) >= 0 and s[0] != '-' except: return False if IP.count(".") == 3 and all(isIPv4(i) for i in IP.split(".")): return "IPv4" if IP.count(":") == 7 and all(isIPv6(i) for i in IP.split(":")): return "IPv6" return "Neither" ob = Solution() print(ob.validIPAddress("172.16.254.1"))
อินพุต
"172.16.254.1"
ผลลัพธ์
"IPv4"