感谢某同学提供的面试题,立马打赏了红包。如果有同学有面试题愿意分享的话,可以关注社区公众号,在那里把面试题给我们。
写一个方法,把字符串转为数字,比如 str="1234",变成 int 1234。你以为这么简单?那么请设计方法实现之后的测试用例!
变成 123
String str="123"+"4"
int num=Integer(str)
那么请设计方法实现之后的测试用例!这句话是啥意思????
这道题我曾经也见过
我遇到过同样的面试题
import re
def string2int01(string):
result = 0
sign = 0
temp = 0
if string[0] == '-':
sign = 1
for str in string[::-1]:
if str in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
result += int(str) * (10 ** temp)
temp += 1
if sign == 1:
result = 0 - result
return result
def string2int02(string):
result = 0
aim = re.findall('[0-9]+', string)
size = len(aim) - 1
for i in range(size, -1, -1):
result += int(aim[i]) * (10 ** (size - i))
if string[0] == '-':
result = 0 - result
return result
String str = "123";
String s1 = String.valueOf(str.charAt(str.length()-1));
int i = Integer.valueOf(s1) + 1;
String s2 = String.valueOf(i);
str = str.concat(s2);
int result = Integer.valueOf(str);
写一写不难吧,关键是设计出对应测试用例,自证自己的实现是正确的
def StrToInt():
words = input('input:')
try:
word = words.replace(' ','')
word = int(word)
return word
except Exception as e:
return e
if __name__=="__main__":
a = StrToInt()
print(a)
面试官:你可以走了
#Testcase1 # 正常输入 123
#Testcase2 # 输入 none
#Testcase3 # 输入""
#Testcase4 # 输入 +
#Testcase5 # 输入-
#Testcase6 # 输入 +0
#Testcase7 # 输入-0
#Testcase8 # 输入 +123
#Testcase9 # 输入-123
#Testcase10 # 输入 abc123
#Testcase11 # 输入 1.234
#Testcase12 # 输入?~!@#$%&*()
#Testcase13 # 输入 99999999999999999999999999999999999999999...9999(测最大有效数字)
#Testcase14 # 输入-99999999999999999999999999999999999999999...9999(测最小有效数字)
我看到了这句话
kotlin
import java.util.*
val str :String? = Scanner(System.`in`).nextLine()
print( "${try { str?.toInt() ?: 0 } catch (e: Exception) { 0 }}")
# Python 黑魔法之 不安全的方式
In [1]: eval('1234')
Out[1]: 1234
# 安全的方式
In [2]: import ast
In [3]: ast.literal_eval('1234')
Out[3]: 1234
def str_to_int(s):
"""
字符串转整形
:param s: 字符串
:return: 结果
"""
if s is None or len(s) == 0:
return '字符串有误。'
try:
return int(s)
except Exception:
return '转换失败'
if __name__ == "__main__":
print(str_to_int('sds'))
这样行吗?
233
#-*- coding: utf-8 -*-
# @Time : 2018/3/16 11:53
# @File : StrToInt.py
# @Author : 守望@天空~
def str_to_int(string):
"""
字符串转整数
:param string: 字符串 str unicode
:return: 整数 int
"""
numbers = [0,1,2,3,4,5,6,7,8,9]
numbers_str = map(str,numbers)
if not isinstance(string ,(str,unicode)):
# raise Exception(u"请输入字符串")
return u"请输入字符串"
if string.startswith("-"):
status = -1
string =string[1:]
elif string.startswith("+"):
status = 1
string = string[1:]
else:
status=1
for i in string:
if i not in numbers_str:
# raise Exception(u"请输入正确的整数")
return (u"请输入正确的整数")
result =0
length = len(string)
if not length:
# raise Exception(u"请输入有效数字")
return "请输入有效数字"
for i,value in enumerate(string):
result += numbers[numbers_str.index(value)]*10**(length-i-1)
return result*status
if __name__=="__main__":
print str_to_int("1234")
print str_to_int("01234")
print str_to_int("#!@#1234")
print str_to_int("asd")
print str_to_int("-1234")
print str_to_int("+1234")
print str_to_int(u"+1234")
print str_to_int(u"+")
print str_to_int(u"-0")
print str_to_int("1234.1234")
print str_to_int(1234)
print str_to_int(1234.1234)
print str_to_int("9"*10086)
if(Int32.TryParse("123"+"4",out int Num))
{
return Num
}
else
{
throw new Exception("无法转换")
}
看语言吧,请各位记得测试 65535,还有数据库的 int、Integer 类型测试,9 楼那个测试显然太黑盒了
写一个方法,把字符串转为数字,比如 str="1234",变成 int 1234。你以为这么简单?那么请设计方法实现之后的测试用例!
功能方面的考虑:
def chenjie(self,number):
numbers=int(number)
print number
这样强制转换就可以但是如果,str=“-1234” 的时候就会报错所以需要修改程序
def chenjie(self,number):
if number[0]=='-':
numbers=int(number[1:])*-1
else:
numbers=int(number)
print number
边界方面的考虑:
我使用的 py2
我还要考虑 str 的取值长度 int 的取值范围
python 本身对 string 长度无强制性限制。使用过程中主要需要考虑电脑性能和程序效率
https://yq.aliyun.com/articles/415562?utm_content=m_41515(有人已经做过实验了,谢谢分享)
32 位系统 int 的范围为 -2*31 到 231-1 -2147483648~2147483647
64 位系统 int 的范围为 -263 到 2*63-1 -9223372036854775808~9223372036854775807
我生成测试数据
边界用例测试数据:
32 位机器上:
-2147483649
-2147483648
2147483647
2147483648
64 位机器上:
-9223372036854775808
-9223372036854775809
9223372036854775807
9223372036854775808
要满足这个条件有需要要修改代码
def chenjie(self,number):
biajielists=[-2147483648,2147483647,-9223372036854775808,9223372036854775807]:
if biajielists[0]<=biajielists<=biajielists[1] or biajielists[2]<=biajielists<=biajielists[3]
if number[0]=='-':
numbers=int(number[1:])*-1
else:
numbers=int(number)
print number
else:print "Out of int length"
# 我在编写这个小程序的时候,使用了变量 number 和 numbers 两个变量,开辟了 2 块内存地址
number 在 numbers 执行后 number 不要使用了,不是长期变量,这里不存在内存不够用的情况。
但是我还是要手动把 number 对象引用删除。
我的理由:我在公司中需要拉取股票基本数据,再使用股票基础数据参与计算,生成数据表给到投研做统计,我当时有一个表 85 字段,15 个基础数据,剩下对都是 15 个字段计算出来的数据,我引用了很多的基础字段后,发现有些字段在计算后就不在使用了,但是,它的应用计数是在程序结束后在变为 0,垃圾回收机制才回收那块内存,有时候我的内存会不够,所以,我后来就开始及时释放不用的对象。我的表大小 85 个字段 20 多年数据(每年 220 条数据)有股票数是 3445 支。85*220*20*3445
所以,我加上了 del(number)
def chenjie(self,number):
biajielists=(-2147483648,2147483647,-9223372036854775808,9223372036854775807)
if biajielists[0]<=number<=biajielists[1] or biajielists[2]<=number<=biajielists[3]:
if number[0]=='-':
numbers=int(number[1:])*-1
else:
numbers=int(number)
del number
print number
else:print "Out of int length"
如果有不对的地方 希望大家指正
看了上面同学的例子,越发觉得自己想得不够全面。 我觉得首先还是要明确需求,输入的条件千千万,输出的条件只有一个,对象的类型是 int。那我也举个例子,输入’abc123‘,我输出 123 是否符合需求?如果符合,那我可以用正则表达式匹配出所有 str 里的数字,然后打印出来。如果不符合,我应该抛出什么样的异常?类似的情况还有浮点数,空格,字符 + 数字组合等等,要把所有的异常都抓出来恐怕不太容易,所以我就干脆用 except Exception as e 这个方法直接抛出 python 自带的异常了。不同的系统可输出的 int 边界值不同这一点是应该考虑到的,不过平时没有怎么接触过这么大的数据
public class Change {
private int returnNum=0;
/*
* 输入一个string,转换成int
*/
Change(String string) {
byte[] by = string.getBytes();
//判断是否带负号
if (by[0] == '-') {
for (int i=1;i<by.length;i++) {
returnNum =returnNum*10+(by[i]-48);
// System.out.println(returnNum);
}
returnNum = ~returnNum+1;
}else{
for (byte b : by) {
returnNum =returnNum*10+(b-48);
// System.out.println(returnNum);
}
}
}
public int getNum() {
return returnNum;
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Change change =new Change("-1234");
System.out.println(change.getNum());
}
}
好吧,我也不清楚自己到底什么程度算自己写,就这样吧,本来只想写正数的,但是强迫症。。请大神多多指教。
用例的话:
1.正向用例一个,就输入 1234
2.边界值总要考虑的,输入的数字超过 int 范围。
3.a) 题目说的是把字符串转化成数字,可能会考虑到 asdf 这种字母。
b) 输入汉字。
c) 标点符号特殊字符。
4.性能的话,实在才疏学浅。不献丑了。。
这种有现成的 api 为啥不用呢,而且这些异常应该在 api 底层都已经判断过了,不需要我们再判断一遍了,加个抛出异常应该可以了吧。
public class StrToInt {
public void strToInt(String s){
int value = 0;
try {
value = Integer.valueOf(s);
System.out.println(value);
}catch (Exception e){
System.out.println(e);
}
}
public static void main(String[] args){
StrToInt s = new StrToInt();
s.strToInt("-2147483647");
}
}
感觉得看看 parseInt 的源码了
public int atoi(String str) {
if (str == null || str.length() < 1)
return 0;
str = str.trim();
char flag = '+';
int i = 0;
if (str.charAt(0) == '-') {
flag = '-';
i++;
} else if (str.charAt(0) == '+') {
i++;
}
double result = 0;
while (str.length() > i && str.charAt(i) >= '0' && str.charAt(i) <= '9') {
result = result * 10 + (str.charAt(i) - '0');
i++;
}
if (flag == '-')
result = -result;
if (result > Integer.MAX_VALUE)
return Integer.MAX_VALUE;
if (result < Integer.MIN_VALUE)
return Integer.MIN_VALUE;
return (int) result;
}
感觉这个跑不起来
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
def str2int(s):
return reduce(lambda x,y: x*10+y, map(char2num, s))
def stringtoint(string):
“”” 不考虑为负数的情况”””
if string.isdecimal()==False:
raise Exception("input should be number!")
result = 0
temp = 0
for str in string[::-1]:
if str in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']:
result += int(str) * (10 ** temp)
temp += 1
return result
白盒测试用例解析
可使用语句覆盖和分支覆盖,因为本代码中的条件仅为一个,所以不考虑条件覆盖,分支条件覆盖,条件组合覆盖
语句覆盖
1)画流程图,识别路径:P1:a-b F2:a-c
流程图简述:真分支为 b,输出语句块 1,假分支路径为 c,输出语句块 2
2)记录分支节点及真假分支: M=string.isdecimal()
3)设计语句覆盖的测试用例 (简写)
测试用例输入 输出 语句块 1 语句块 2 覆盖路径
‘123’ 123 123 P1
‘-123’ input should be number input should be number P2
4)设计分支覆盖的测试用例
测试用例输入 输出 M 覆盖路径
‘123’ 123 123 P1
‘-123’ input should be number P2
考虑等价类和边界值两种设计方法
用例编号 等价类集合 边界值
1 (10-2147483647 之间的数字 0
2 2147483647
3 100000
4 (2)负整数 -1
5 -999999
6 (3)含非数字字符 abcd
7 Abc123efg
8 123 456
9 123[TAB] 456
10 123\t
11 123.01
12 (5) 位数超过 2147483647 2147483648
13 (6) 为空
import string
if 1234 == string.atoi("1234");
return Ture
else
return False