Java面试宝典系列之字符串转整型、判断IP合法性、求最大公约数_java判断字符串能否转成整形-程序员宅基地

技术标签: 面试  算法  

一、将字符串转成整型

字符串转整形是一个比较简单的算法,关键在于转换之前的一系列判断,

1、判断正负

2、去掉字符串中不能转化成整型的因素(包括各种符号、小数点、字母、空格)

3、去掉第一个数字前的所有0

4、结果是否超出整型范围(-2^31~2^31-1),处理

通过以上判断,我们得出了下面的程序:

package com.xtfggef.algo.stringtoint;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @time 2013/04/23
 * @author egg
 * @weibo http://weibo.com/xtfggef
 */
public class StringToInt {

	static int flag = 1;
	static String count = "";
	static int value = 0;

	/**
	 * get rid of the unuse char
	 * 
	 * @param oldStr
	 * @return
	 */
	public static String judgeString(String oldStr) {
		String regEx = "[^0-9]";
		Pattern p = Pattern.compile(regEx);
		Matcher m = p.matcher(oldStr);
		String newStr = m.replaceAll("").trim();
		return newStr;
	}

	/**
	 * judge first char for '+' or '-'
	 * 
	 * @param oldStr
	 * @return
	 */
	public static int judgeFirst(String oldStr) {
		String ch = oldStr.substring(0, 1);
		if ("-".equals(ch)) {
			return -1;
		} else {
			return 1;
		}
	}

	/**
	 * get rid of the '0' front of first number
	 * 
	 * @param oldStr
	 * @return
	 */
	public static String getRidZero(String oldStr) {
		return oldStr.replaceAll("^(0+)", "");
	}

	/**
	 * string to int core code
	 * 
	 * @param count
	 * @return
	 */
	public static int stringToInt(String count) {
		char value[] = count.toCharArray();
		double sum = 0;
		for (int i = 0; i < value.length; i++) {
			sum = sum * 10 + value[i] - '0';
		}
		double tmp = sum * flag;
		if (tmp <= Integer.MAX_VALUE && tmp >= Integer.MIN_VALUE) {
			return (int) tmp;
		} else {
			return 0;
		}
	}

	public static void main(String[] args) {

		String s = "-07sadff65-=.,,,/,0849";

		/* judge the first char */
		flag = judgeFirst(s);

		/* get rid of the non-validity char */
		count = judgeString(s);

		/* get rid of the 0 from the first number */
		count = getRidZero(count);

		/* string 2 int */
		value = stringToInt(count);

		if (value != 0) {
			System.out.println(value);
		} else {
			System.out.println("value out of range of int!");
		}
	}
}

二、判断ip的合法性

1、从.的数量来看,必须等于3个
2、每两个点儿之间的数必须在0~255之间
3、每个数必须<9且>0,且不能是非数字的字符
4、第一个、最后一个字符不能是“.”,且第一个亦不能为0

5、每小节第一个数不能是0

6、不能有连续的.

7、每节不能有连续的0,或者如果第一个为0,第二个不能为0

为了代码月的方便,我建了一个常量类:

package com.xtfggef.algo.judgeip;

public class Constant {
	public static String DOTMORETHANTHREE = "多于三个dot";
	public static String LESSTHANTHREE = "少于三个dot";
	public static String GREATTHAN = "单节不能大于255或者小于0";
	public static String ISZERO = "每节开头不能为0";
	public static String INVALIDCHAR = "无效的字符";
	public static String ERRORS = "第一个字符不能为0和.,最后一个不能为.!";
	public static String VALID = "IP 合法";
	public static String INVALID = "IP 不合法!";
	public static String TWODOTS = "不能有连续的dot";
	public static String CANNOTISZERO = "每节不能连续两个数为0,或者第一个为0但是第二个不为0";
}

下面是判断类:

package com.xtfggef.algo.judgeip;


public class JudgeIp {

	static int is_valid_ip(char[] ip) {

		int section = 0;
		int dot = 0;
		int flag = 0;  
		int flag2 = 0;
		int flag3 = 0;
		
		if (ip[0] != '.' && ip[0] != '0' && ip[ip.length - 1] != '.') {
			for (int i = 0; i < ip.length; i++) {
				if (flag == 1) {
					if (ip[i] == '.') {
						System.out.println(Constant.TWODOTS);
						return 0;
					}
				}
				if (ip[i] == '.') {
					dot++;
					if (dot > 3) {
						System.out.println(Constant.DOTMORETHANTHREE);
						return 0;
					}
					if (section >= 0 && section <= 255) {
						section = 0;
					} else {
						System.out.println(Constant.GREATTHAN);
						return 0;
					}
					flag = 1;
					flag2 = 0;
					flag3 = 0;

				} else if (ip[i] >= '0' && ip[i] <= '9') {

					flag2++;
					if (flag == 1) {
						if (ip[i] == '0') {
							flag3 = 1;
						}
					}
					if (flag2 == 2 && flag3 == 1) {
						System.out.println(Constant.CANNOTISZERO);
						return 0;
					}
					section = section * 10 + ip[i] - '0';
					
					flag = 0;
				} else {
					System.out.println(Constant.INVALIDCHAR);
					return 0;
				}
			}
			if (section >= 0 && section <= 255) {
				if (3 == dot) {
					section = 0;
					System.out.println("IP address success!");
					return 1;
				} else {
					System.out.println(Constant.LESSTHANTHREE);
					return 0;
				}
			}
		} else {
			System.out.println(Constant.ERRORS);
			return 0;
		}
		return 0;
	}

	public static void main(String[] args) {
		String ip = "23.252.49.22";
		System.out.println("ip:" + ip);
		char new_ip[] = ip.toCharArray();
		int flag = is_valid_ip(new_ip);
		if (flag == 1) {
			System.out.println(Constant.VALID);
		} else {
			System.out.println(Constant.INVALID);
		}
	}
}

感觉逻辑不多,但是判断起来还有点儿麻烦,总的来说暂时我是想不出什么问题了,大家去试试,多找几种情况,欢迎提出建议!

三、求最大公约数
这个非常简单,估计大多数人都能马上写出来:

package com.xtfggef.algo.gcd;

public class MaxGcd {
	public static void main(String[] args) {
		System.out.println(gcd(24, 12));
	}

	public static int gcd(int a, int b) {
		while (a != b) {
			if (a > b) {
				a = a - b;
			} else {
				b = b - a;
			}
		}
		return a;
	}
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhangerqing/article/details/8831532

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法