zoukankan      html  css  js  c++  java
  • 蓝桥杯:IP判断


    看到这题第一个想法就是题目要考查字符串的截取,将一个IP地址中的4个位段中的数字截取出来,再进行判断看符不符合规则。简单的说就是考查字符串的处理,既然是对字符串处理,那除了截取字符串再进行判断这种方法以外,用正则进行处理也很方便。比赛的时候突然想不到用正则的话,规规矩矩的用截取再判断也挺稳的,就是比较啰嗦。

    解析一:

    第一种方法是用split()方法将IP地址中的四个位段中的数据截取出来,之后就按照常用的方法根据题目要求对着四个数据进行判断了,如果四个数据都符合题意,就返回'Y'。另外这里多提一个点,对整数前导0的判断有两种实现方法,一种是通过字符串的下标,对这个字符串的首字符进行判断,如果是0就返回'N';另一种方式是调用String的startsWith()方法进行判断.额外说一下,题目会要求对字母的情况也进行判断,是因为大小写的英文字母在ASCII表中都有对应的数字,字符状态下会变成数字进行输出,所以要字母进行单独处理。使用第一种方法因为要将字符串转换成整形,所以进行异常抛出就行了;使用正则就更方便了,不对字母进行匹配就好了。

    解析一的代码:

    package _12_26_test;
    
    import java.awt.PageAttributes;
    import java.awt.print.PageFormat;
    import java.util.Scanner;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /*
     * 通过匹配符号.切割出四个数据
     * 对四个数据进行范围判断
     * A.B.C.D
     * 使用split()方法进行切割或者使用if进行切割,推荐使用split()
     * 
     * 
     * */
    public class seven {
    
    	public static void main(String[] args) {
    
    		Scanner scanner = new Scanner(System.in);
    
    		while (scanner.hasNext()) {
    			String flag = "Y";
    			String get = scanner.next();
    			// 对ip地址进行切割,分成四个数据放进数组中
    			String num[] = get.split("\.", 4);
    
    			for (int i = 0; i < 4; i++) {
    
    				try {
    					// 通过startsWith()方法判断数据是否有前导0
    					if (num[i].startsWith("0") && num[i].length() != 1) {
    						flag = "N";
    						break;
    					}
    					// 判断数据大小是否在[0,255]之间
    					int IntNum = Integer.parseInt(num[i]);
    					if (IntNum >= 0 && IntNum <= 255) {
    						continue;
    					} else {
    						flag = "N";
    						break;
    					}
    				} catch (Exception e) {
    					/*
    					 * 因为上面有使用到Integer.parseInt()方法将String类型的数字转变成int类型,
    					 * 如果数据是字母就会抛出异常,所以这里使用try catch可以处理字母判断这个问题
    					 * */ 
    					flag = "N";
    					break;
    				}
    
    			}
    			System.out.println(flag);
    
    		}
    
    	}
    
    }
    
    

    解析二:

    第二种方法就是用正则表达式去匹配了,这种方法如果对正则掌握的比较熟的话很方便,只要注意匹配式不要写错就行了。重点就是匹配式的梳理,这里根据题目要求可以分成三种情况:

    第一种:一个数字,这种情况最简单,直接使用d或者[0-9]就行了

    第二种:两个数字,这种情况要注意开头的数字不能为0,因为题目要求前导0不能为0,第二个数字可以任意,使用[1-9]d可以实现。

    第三种:三个数字,三个数字的情况最啰嗦,不但要注意前导数为0的情况,还要注意最大值的判断。因为最大值是255,所以第一个数字只能是1或2。

    • 第一个数字为1的时候,后面两个数字可以任意匹配,无论怎么取值都不会超过255,使用1dd可以实现。
    • 第二个数字为2的时候分为两种情况,如果第二个数不是5,那第三个数就可以取任意值,无论怎么取都不会超过255,使用2[0-4]d可以实现;当第二个数是5时,第三个数最大不能超过5,使用25[0-5])可以实现

    解析二代码

    package _12_26_test;
    
    import java.util.Scanner;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /*
     * 根据题目要求,每个ip地址中的位段数据需要符合以下要求
     * 1、数据在[0,255]的范围内
     * 2、数据不能是英文字母,因为英文字母在ASCII码中也是一个数字
     * 3、数据的前导不能为0
     * 使用正则表达式:
     * */
    public class eight {
    
    	public static void main(String[] args) {
    
    		// TODO Auto-generated method stub
    
    		Scanner sc = new Scanner(System.in);
    
    		while (sc.hasNext()) {
    
    			String flag = "Y";
    
    			String num = sc.nextLine();
    			/*
    			 * 一个数字: 
    			 * 两个数字:1或者2开头,第二个数字可以随机 
    			 * 三个数字:1或者2开头,如果第二个数字小于5,第三个数字可以随机
    			 * 					  如果第三个数字等于5,第三个数字最大值为5
    			 */
    			String regex = "(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])."
    					+ "(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])."
    					+ "(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])."
    					+ "(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])";
    
    			Pattern pattern = Pattern.compile(regex);
    			Matcher matcher = pattern.matcher(num);
    
    			if (matcher.matches()) {
    				flag = "Y";
    			} else {
    				flag = "N";
    			}
    
    			System.out.println(flag);
    
    		}
    
    	}
    
    }
    

    实现效果

  • 相关阅读:
    leetcode 70 Climbing Stairs ----- java
    leetcode 69 Sqrt(x) ---java
    leetcode 68 Text Justification ----- java
    如何把iOS代码编译为Android应用
    OpenSource.com 评出 2014 年十佳开源软件
    js singleton
    Java NIO
    WPAD 的原理及实现
    WebKit JavaScript Binding添加新DOM对象的三种方式
    react
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/12673536.html
Copyright © 2011-2022 走看看