把字符串转换成整数
题目描述
将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
分析
这题比较简单,主要就是分析开头是不是符号然后例外情况,其他的没什么。就是记录一下。
代码如下:
int StrToInt(string str) {
int num = 0;
if (str.size() == 0) {
return 0;
}
int start = 0;
if (str[0] == '+' || str[0] == '-') {
start = 1;
}
for (int i = start; i < str.size(); ++i) {
if (str[i] - '0' < 0 || str[i] - '0' > 9) {
return 0;
}
num = num * 10 + str[i] - '0';
}
if (str[0] == '-') {
num = -num;
}
return num;
}
数组中的重复数字
题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
分析
该题做肯定是能够做出来的,关键是如何在时间 O(n), 空间 O(1) 的情况下做出来。
注意到数组长度为 n,数字大小在 0~n-1 范围内。那么,如果数字排序且无重复,则它们在数组中的索引即为它们的值。
从 索引 0 开始,设其位置上的数字为 num,则将 array[0] 与 array[num] 进行交换,若交换后array[0] 不等于 0,则重复上述步骤。具体的代码就不写了,因为我写的不是最好的代码,这个方法也是看别人的,哈哈。
表示数值的字符串
题目描述
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。
分析
我用的是笨方法,排除所有错的情况,剩下的就是对的情况。
所有错的情况:
- 出现非法字符
- e|E 的出现次数 >1
- 小数点的出现次数>1
- 当前字符为+|-,后一个字符不是数字也不是小数点
- 当前字符为+|-,前一个字符不是e|E,也当前字符不是第一个字符,后一个字符为数字
- 当前字符为e|E,小数点不在其后一个位置
- 当前字符为e|E,其后为不+|-或者其为最后一个字符
必须得承认,我的逻辑是混乱的,错了好多次才勉强通过,而且通过也不代表我的代码是对的。不过还是勉强做一个记录吧。作为反面教材。
代码能力还是很烂啊,必须得勤加练习了。
还是贴个代码吧
# include <iostream>
using namespace std;
bool isNumeric(char* string)
{
int cnt_e = 0;
int cnt_point = 0;
for (int i = 0; string[i] != '\0'; ++i) {
if ((string[i] < '0' || string[i] > '9') && string[i] != 'e' && string[i] != 'E' && string[i] != '+' && string[i] != '-' && string[i] != '.') {
return 0;
}
if (string[i] == 'e' || string[i] == 'E') {
cnt_e += 1;
if (cnt_e > 1) {
return 0;
}
}
if (string[i] == '.') {
cnt_point += 1;
if (cnt_point > 1) {
return 0;
}
}
if (string[i] == '+' || string[i] == '-') {
if (((string[i+1] < '0' || string[i+1] > '9') && string[i+1] != '.')) {
return 0;
}
}
if (string[i] == '+' || string[i] == '-') {
if ((i != 0 && string[i - 1] != 'E' && string[i - 1] != 'e') && (string[i + 1] >= '0' && string[i + 1] <= '9')) {
return 0;
}
}
if (string[i] == 'e' || string[i] == 'E') {
for (int j = i + 1; string[j] != '\0'; ++j) {
if (string[j] == '.') {
return 0;
}
}
}
if ((string[i] == 'e' || string[i] == 'E')&& (string[i + 1] == '\0' || string[i+1] != '+' && string[i+1] != '-')) {
return 0;
}
}
return 1;
}
参考文献
https://blog.youkuaiyun.com/jsqfengbao/article/details/47438557