1、把字符串转换为整数(剑指offer--49)
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
本题目不是很难,但有几个注意事项
1.要判断输入字符串是否有效,即判断输入字符串是否为空和判断字符串中有没有其他非数字的字符
2.判断字符串开头是否带有符号,例如输入“+123”,结果为“123”,输入“-123”,结果为“-123”
3.输入正常时,开始计算,还是以"345"作为例子。当我们扫描到字符串的第一个字符'3'时,我们不知道后面还有多少位,仅仅知道这是第一位,因此此时得到的数字是3。当扫描到第二个数字'4'时,此时我们已经知道前面已经一个3了,再在后面加上一个数字4,那前面的3相当于30,因此得到的数字是3*10+4=34。接着我们又扫描到字符'5',我们已经知道了'5'的前面已经有了34,由于后面要加上一个5,前面的34就相当于340了,因此得到的数字就是34*10+5=345。因此,计算思路是,每扫描一个字符,将之前得到的结果乘以10加上当前扫描字符表示的数字。
4.函数返回值为boolean表示输入是否合法,用一个static变量来存放结果
2、模式匹配
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
本题目不是很难,但有几个注意事项
1.要判断输入字符串是否有效,即判断输入字符串是否为空和判断字符串中有没有其他非数字的字符
2.判断字符串开头是否带有符号,例如输入“+123”,结果为“123”,输入“-123”,结果为“-123”
3.输入正常时,开始计算,还是以"345"作为例子。当我们扫描到字符串的第一个字符'3'时,我们不知道后面还有多少位,仅仅知道这是第一位,因此此时得到的数字是3。当扫描到第二个数字'4'时,此时我们已经知道前面已经一个3了,再在后面加上一个数字4,那前面的3相当于30,因此得到的数字是3*10+4=34。接着我们又扫描到字符'5',我们已经知道了'5'的前面已经有了34,由于后面要加上一个5,前面的34就相当于340了,因此得到的数字就是34*10+5=345。因此,计算思路是,每扫描一个字符,将之前得到的结果乘以10加上当前扫描字符表示的数字。
4.函数返回值为boolean表示输入是否合法,用一个static变量来存放结果
5.由于输入为字符串,因此可能存在溢出问题,所以用long型来存放结果
static long result = 0;//存储返回结果
public static boolean strToint(String str) {
if (str == null) {
return false;// 输入无效
}
int position = 0;// 字符串指针
boolean minus = true;// 数字正负判断 true--正
if (str.charAt(0) == '+') {
position++;
} else if (str.charAt(0) == '-') {
position++;
minus = false;
}
if (position == str.length())
return false; // 只有+、-号返回false
for (int i = position; i < str.length(); i++) {
// 判断是否有非数字的输入
if (str.charAt(i) < '0' || str.charAt(i) > '9')
return false;
int flag = minus ? 1 : -1;
result = result * 10 + flag * (str.charAt(i) - '0');
// 判断是否溢出
if ((minus && result > 0x7FFFFFFF)
|| (!minus && result < 0x80000000)) {
return false;
}
}
return true;
}
2、模式匹配
题目:在一个字符串中找是否存在另一个z字符串
解法一:
将主串S中某个位置i起始的子串和模式串T相比较。即从 j=0 起比较 S[i+j] 与 T[j],若相等,则在主串 S 中存在以 i 为起始位置匹配成功的可能性,继续往后比较( j逐步增1 ),直至与T串中最后一个字符相等为止,否则改从S串的下一个字符起重新开始进行下一轮的"匹配",即将串T向后滑动一位,即 i 增1,而 j 退回至0,重新开始新一轮的匹配。
// 简单模式匹配
public static boolean index(String S, String T) {
if (S.length() < 1 || T.length() < 1) {
return false;
}
int i = 0, j = 0;
while (i != S.length() && j != T.length()) {
if (S.charAt(i) == T.charAt(j)) {
++i;
++j;
if (j == T.length())
return true;
} else {
i = i - j + 1;
j = 0;
}
}
return false;
}
解法二:KMP算法
详细过程见:
// KMP模式匹配
public static boolean KMPindex(String S, String T) {
if (S.length() < 1 || T.length() < 1) {
return false;
}
int next[] = getNext(T);
int i = 0, j = 0;
while (i != S.length() && j != T.length()) {
if (j == -1 || S.charAt(i) == T.charAt(j)) {
++i;
++j;
if (j == T.length())
return true;
} else {
j = next[j];
}
}
return false;
}
public static int[] getNext(String T) {
int[] next = new int[T.length()];
next[0] = -1;
int i = 0, j = -1;
while (i < T.length()-1) {
// 这里注意,i==0的时候实际上求的是next[1]的值,以此类推
if (j == -1 || T.charAt(i) == T.charAt(j)) {
++i;
++j;
next[i] = j;
} else {
j = next[j];
}
}
return next;
}