剑指 offer:把字符串转换成整数、数组中重复的数字

把字符串转换成整数

题目描述
将一个字符串转换成一个整数(实现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"都不是。

分析
我用的是笨方法,排除所有错的情况,剩下的就是对的情况。
所有错的情况:

  1. 出现非法字符
  2. e|E 的出现次数 >1
  3. 小数点的出现次数>1
  4. 当前字符为+|-,后一个字符不是数字也不是小数点
  5. 当前字符为+|-,前一个字符不是e|E,也当前字符不是第一个字符,后一个字符为数字
  6. 当前字符为e|E,小数点不在其后一个位置
  7. 当前字符为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值