https://leetcode-cn.com/problems/validate-ip-address
题目的意思是需要通过题目中给的条件去判断IP地址是否合法,需要判断的边界情况比较多,需要注意。这里采用的方法是尽量少记录状态,而尽量多在遍历中发现问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| class Solution { public: bool valid_ipv4(string& IP) { vector<int> ip_arr(4, 0); int pos = 0; for(int i=0; i<IP.size(); ++i) { char c = IP[i]; if(c == '.') { ++pos; if(pos > 3) return false; if(i==0 || i==IP.size()-1) return false; if(i<IP.size()-1 && i!=0 && IP[i+1]=='.') return false; }else if (c == '0') { if((i==0 || IP[i-1]=='.') && i<IP.size()-1 && IP[i+1]!='.') return false; } else if(c >= '1' && c <= '9') { ip_arr[pos] *= 10; ip_arr[pos] += c-'0'; } else return false; if(ip_arr[pos] > 255) return false; } if(pos != 3) return false; return true; } bool valid_ipv6(string& IP) { vector<int> ip_arr(8, 0); int pos = 0; int g_num = 0; for(int i=0; i<IP.size(); ++i) { char c = IP[i]; if(c == ':') { ++pos; g_num = -1; if(pos > 7) return false; if(i<IP.size()-1 && IP[i+1]==':') return false; } else if(c >= '0' && c <= '9') { ip_arr[pos] *= 16; ip_arr[pos] += c-'0'; } else if(c >= 'a' && c <= 'f') { ip_arr[pos] *= 16; ip_arr[pos] += c-'a'+10; } else if(c >= 'A' && c <= 'f') { ip_arr[pos] *= 16; ip_arr[pos] += c-'A'+10; } else return false; ++g_num; if(g_num > 4) return false; if(ip_arr[pos] > 65535) return false; } return true; } string validIPAddress(string IP) { for(char c:IP) { if(c == '.') { if(valid_ipv4(IP)) return "IPv4"; break; } else if(c == ':') { if(valid_ipv6(IP)) return "IPv6"; break; } } return "Neither"; } };
|