例题讲解:例题1:IP地址解析(拼多多面试题)
给定一个字符串表示的IP地址, 如“123.92.2.34”,判断其是否合法。合法IP地址的规则如下:
a.除了空格、数字和.之外,不得包含其他字符。
b.IP地址由四个数字构成,由.分隔,每个,隔开的数字大小在0~255之间。
c.数字前后可以有空格,但中间不能有空格。比如"123.92.2.34“合法,"123.9 2.2.34"
非法。
当然,这个问题还可以继续加一些规则,让题目变得更加复杂,比如每个数字不能有前导0,但
可以为0。比如“021.3.02.34“非法,“0.2.0.33”合法。
题解(Java)
package 算法.规律题;
import java.util.Scanner;
public class IP地址解析 {
/**
* 例题讲解:例题1:IP地址解析
* 给定一个字符串表示的IP地址, 如“123.92.2.34”,判断其是否合法。合法IP地址的规则如下:
* a.除了空格、数字和.之外,不得包含其他字符。
* b.IP地址由四个数字构成,由.分隔,每个,隔开的数字大小在0~255之间。
* c.数字前后可以有空格,但中间不能有空格。比如"123.92.2.34“合法,"12 3.92.2.34"
* 非法。
* 当然,这个问题还可以继续加一些规则,让题目变得更加复杂,比如每个数字不能有前导0,但
* 可以为0。比如“021.3.02.34“非法,“0.2.0.33”合法。
*
* @param args
*/
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String ip = scanner.nextLine();
System.out.println(check(ip) ? "合法" : "非法");
}
public static boolean check(String ip) {
if (ip == null) {
return false;
}
//分割字符串
String[] ipSegments = ip.split("\\.");
//判断分割后字符串是否为4部分组成
if (ipSegments.length != 4) {
return false;
}
//验证每一段是否合法
for (int i = 0; i < 4; i++) {
boolean isValid = checkSegment(ipSegments[i]);
if (!isValid) return false;
}
return true;
}
private static boolean checkSegment(String ipSegment) {
int n = ipSegment.length();
int i = 0;
//跳过前面空格 例如“ 123”
//chartAt(i)相当于 ipSegment【i】
while (i < n && ipSegment.charAt(i) == ' ') {
i++;
}
//字符串全为空格
if (i == n) {
return false;
}
//处理数字(将字符串转化为数字),例如”123 “
int digit = 0;
while (i < n && ipSegment.charAt(i) != ' ') {
char c = ipSegment.charAt(i);
if (c < '0' || c > '9') {//非数字字符
return false;
}
// c = '1' -> 1
digit = digit * 10 + (c - '0');
if (digit > 255) {//数字超过225
return false;
}
i++;
}
//后置处理,例如"123 " or "12 3"
while (i < n) {
char c = ipSegment.charAt(i);
if (c != ' ') { //后面居然还有非空字符
return false;
}
i++;
}
return true;
}
}
标签:return,数字,IP地址,空格,算法,ipSegment,false,解析
From: https://blog.csdn.net/2301_80419036/article/details/142527930