字符串转换成整数(Java)

题目:字符串转换为整数。

思路:将字符串转化为整数首先是遍历字符串中的每一个字符,有三种情况:首字符是正号,首字符是负号,首字符非正负号;然后遍历每一个字符进行num = num * 10 + charArray[i] - '0',在进行这个工作之前首先需要对charArray[i]进行是否为数字字符的判断,循环遍历直到结束,输出结果;

注意事项(思考点):(1)字符串中包含有非数字字符;(2)字符串中包含正负符号;(3)考虑最大的正整数;(4)考虑最小的负整数;(4)溢出。

开始时我的想法只考虑了第一,第二种情况:

/**
 * 将字符串转换为整数 1:非数字字符 2:正负号 
 * @author Peter
 */
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		int length = str.length();
		int number = 0;
		char[] charArray = str.toCharArray();
		if (charArray[0] == '-') {
			for (int i = 1; i < length; i++) {
				if (charArray[i] > '9' || charArray[i] < '0') {
					System.out.println("输入的字符串中包含非数字字符");
					return;
				} else {
					number = number * 10 + charArray[i] - '0';
				}
			}
			System.out.println(-number);
		} else if (charArray[0] == '+') {
			for (int i = 1; i < length; i++) {
				if (charArray[i] > '9' || charArray[i] < '0') {
					System.out.println("输入的字符串中包含非数字字符");
					return;
				} else {
					number = number * 10 + charArray[i] - '0';
				}
			}
			System.out.println(number);
		} else {
			for (int i = 0; i < length; i++) {
				if (charArray[i] > '9' || charArray[i] < '0') {
					System.out.println("输入的字符串中包含非数字字符");
					return;
				} else {
					number = number * 10 + charArray[i] - '0';
				}
			}
			System.out.println(number);
		}
	}
}

源码(考虑了上面所有情况):

package com.chap01.offer01;

import java.util.Scanner;

/**
 * 字符串转整形源码
 */
public class Main1 {

	/**
	 * 将字符串转化为整形
	 * @param s
	 * @return
	 * @throws NumberFormatException
	 */
	public static int parseInt(String s) throws NumberFormatException {
		return parseInt(s, 10);
	}
	
	/**
	 * 将字符串转化为整形,其中radix代表基数,即代表你输入的是几进制的字符串。
	 * @param s
	 * @param radix
	 * @return
	 * @throws NumberFormatException
	 */
	public static int parseInt(String s, int radix)
			throws NumberFormatException {
		/*
		 * WARNING: This method may be invoked early during VM initialization
		 * before IntegerCache is initialized. Care must be taken to not use the
		 * valueOf method.
		 */
		
		//判断是否为空
		if (s == null) {
			throw new NumberFormatException("null");
		}
		
		//判断不能小于2进制
		if (radix < Character.MIN_RADIX) {
			throw new NumberFormatException("radix " + radix
					+ " less than Character.MIN_RADIX");
		}

		//判断不能大于36进制 0-9,a-z一共36进制
		if (radix > Character.MAX_RADIX) {
			throw new NumberFormatException("radix " + radix
					+ " greater than Character.MAX_RADIX");
		}

		int result = 0;
		boolean negative = false;
		int i = 0, len = s.length();
		int limit = -Integer.MAX_VALUE;  //-0x7fffffff即:-2147483647 
		int multmin;
		int digit;

		if (len > 0) {
			char firstChar = s.charAt(0);  //取首字符
			if (firstChar < '0') { // Possible leading "+" or "-"
				if (firstChar == '-') {
					negative = true;
					limit = Integer.MIN_VALUE;  //0x80000000
				} else if (firstChar != '+')
					throw NumberFormatException.forInputString(s);

				if (len == 1) // Cannot have lone "+" or "-"
					throw NumberFormatException.forInputString(s);
				i++;
			}
			multmin = limit / radix;  //-214748364
			while (i < len) {
				// Accumulating negatively avoids surprises near MAX_VALUE
				digit = Character.digit(s.charAt(i++), radix);  //返回指定基数的数值
				if (digit < 0) {
					throw NumberFormatException.forInputString(s);
				}
				if (result < multmin) {
					throw NumberFormatException.forInputString(s);
				}
				result *= radix;  //字符abc: a*100 + b*10 + c
				if (result < limit + digit) {
					throw NumberFormatException.forInputString(s);
				}
				result -= digit;
			}
		} else {
			throw NumberFormatException.forInputString(s);
		}

		return negative ? result : -result;
	}
	
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		int num = parseInt(str);
		System.out.println(num);
	}
}
package com.chap01.offer01;
//异常类
public class NumberFormatException extends IllegalArgumentException {
	static final long serialVersionUID = -2848938806368998894L;

	/**
	 * Constructs a NumberFormatException with no detail message.
	 */
	public NumberFormatException() {
		super();
	}

	/**
	 * Constructs a NumberFormatException with the specified detail
	 * message.
	 * 
	 * @param s
	 *            the detail message.
	 */
	public NumberFormatException(String s) {
		super(s);
	}

	/**
	 * Factory method for making a NumberFormatException given the
	 * specified input which caused the error.
	 * 
	 * @param s
	 *            the input causing the error
	 */
	static NumberFormatException forInputString(String s) {
		return new NumberFormatException("For input string: \"" + s + "\"");
	}
}


你可能感兴趣的:(剑指offer,面试-剑指offer刷题小结)