【中等】将整数字符串转成整数值-Java
分享一个大牛的人工智能教程。零基础通俗易懂风趣幽默希望你也加入到人工智能的队伍中来请轻击人工智能教程大家好欢迎来到我的网站 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑人工智能时代就要来临了科… 继续阅读 前言https://www.captainai.net/troubleshooterpackage live.every.day.CodingInterviewGuide.String; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.*; /** * 将整数字符串转成整数值 * * 【题目】 * 给定一个字符串str如果str符合日常书写的整数形式并且属于32位整数的范围返回str所代表的整数值否则返回0。 * 先写测试用例再写方法。 * * 【难度】 * 中等 * * author Created by LiveEveryDay */ public class IntStr2IntTest { Test public void testNormalPositiveNumber() { assertEquals(123, IntStr2Int.convert(123)); assertEquals(4567, IntStr2Int.convert(4567)); } Test public void testNormalNegativeNumber() { assertEquals(-123, IntStr2Int.convert(-123)); assertEquals(-4567, IntStr2Int.convert(-4567)); } Test public void testLeadingWhitespace() { assertEquals(123, IntStr2Int.convert( 123)); assertEquals(-456, IntStr2Int.convert( -456)); } Test public void testTrailingNonNumeric() { assertEquals(0, IntStr2Int.convert(123abc)); assertEquals(0, IntStr2Int.convert(-456中文)); } Test public void testNonNumericStart() { assertEquals(0, IntStr2Int.convert(中文123)); assertEquals(0, IntStr2Int.convert(abc-456)); } Test public void testNull() { assertEquals(0, IntStr2Int.convert(null)); } Test public void testEmptyString() { assertEquals(0, IntStr2Int.convert()); } Test public void testOnlyWhitespace() { assertEquals(0, IntStr2Int.convert( )); } ParameterizedTest ValueSource(strings {2147483647}) public void testPositiveMaxValue(String input) { assertEquals(Integer.MAX_VALUE, IntStr2Int.convert(input)); } ParameterizedTest ValueSource(strings {-2147483648}) public void testNegativeMinValue(String input) { assertEquals(Integer.MIN_VALUE, IntStr2Int.convert(input)); } ParameterizedTest ValueSource(strings {2147483648, 2147483649}) public void testPositiveOverflow(String input) { assertEquals(0, IntStr2Int.convert(input)); } ParameterizedTest ValueSource(strings {-2147483649, -2147483650}) public void testNegativeOverflow(String input) { assertEquals(0, IntStr2Int.convert(input)); } }package live.every.day.CodingInterviewGuide.String; /** * 将整数字符串转成整数值 * * 【题目】 * 给定一个字符串str如果str符合日常书写的整数形式并且属于32位整数的范围返回str所代表的整数值否则返回0。 * 先写测试用例再写方法。 * * 【难度】 * 中等 * * 【解答】 * 解决本题的方法有很多本文仅提供一种供读者参考。 * * 首先检查str是否符合日常书写的整数形式具体判断如下 * 1.如果str不以-开头也不以数字字符开头例如strA12”返回false。 * 2.如果str以-开头。但是str的长度为1即str-返回false。如果str的长度大于1但是-的后面紧跟着0例如 * str-0或-012返回false。 * 3.如果str以0开头但是str的长度大于1例如str023返回false。 * 4.如果经过步骤1~步骤3都没有返回接下来检查str[l..N-1]是否都是数字字符如果有一个不是数字字符返回false。如果都 * 是数字字符说明str符合日常书写返回true。 * 具体检查过程请参看如下代码中的isValid方法。 * * 如果str不符合日常书写的整数形式根据题目要求直按返回0即可。 * 如果符合则进行如下转换过程 * 1.生成4个变量。布尔型常量posi表示转换的结果是负数还是非负数这完全由str开头的字符决定如果以“-”开头那么转换的 * 结果一定是负数则posi为false否则posi为true。整型常量minqminq等于Integer.MIN_VALUE/10即32位整数最小值 * 除以10得到的商。整型常量minrminr等于Integer.MINVALUE%10即32位整数最小值除以10得到的余数。整型变量res转换 * 的结果初始时res0。 * 2.32位整数的最小值为-214748364832位整数的最大值为2147483647。可以看出最小值的绝对值比最大值的绝对值大1所以 * 转换过程中的绝对值一律以负数的形式出现然后根据posi决定最后返回什么。也就是说既然负数比正数拥有更大的绝对值范围那 * 么转换过程中一律以负数的形式记录绝对值最后再决定返回的数到底是什么。 * 3.如果str以-开头从str[1]开始从左往右遍历str否则从str[O]开始从左往右遍历str。出现任何一种溢出情况时直接返 * 回0。 * 4.遍历后得到的res根据posi的符号决定返回值。如果posi为true说明结果应该返回正否则说明应该返回负。如果res正好是 * 32位整数的最小值同时又有posi为true说明溢出直接返回0。 * 全部过程请参看如下代码中的convert方法。 * * author Created by LiveEveryDay */ public class IntStr2Int { public static int convert(String str) { if (str null || str.equals() || str.trim().length() 0) { return 0; } char[] chars str.trim().toCharArray(); if (!isValid(chars)) { return 0; } boolean posi chars[0] ! -; int minq Integer.MIN_VALUE / 10; int minr Integer.MIN_VALUE % 10; int res 0; int cur 0; for (int i posi ? 0 : 1; i chars.length; i) { cur 0 - chars[i]; if ((res minq) || (res minq cur minr)) { return 0; } res res * 10 cur; } if (posi res Integer.MIN_VALUE) { return 0; } return posi ? -res : res; } private static boolean isValid(char[] chars) { if (chars[0] ! - (chars[0] 0 || chars[0] 9)) { return false; } if (chars[0] - (chars.length 1 || chars[1] 0)) { return false; } if (chars[0] 0 chars.length 1) { return false; } for (int i 1; i chars.length; i) { if (chars[i] 0 || chars[i] 9) { return false; } } return true; } public static void main(String[] args) { String str -123; System.out.printf(The number is: %d, convert(str)); } } // ------ Output ------ /* The number is: -123 */
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2440773.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!