判断两个字符串是否互为变形词 & 判断两个字符串是否互为旋转词 & 将整数字符串转成整数值
判断两个字符串是否互为变形词
《程序员代码面试指南》第77题 P253 难度:士★☆☆☆
这题很快做出来,不过和题解还是有差距的。
如果字符串str1和str2长度不同,直接返回false。如果长度相同,申请一个长度为256的整型数组map(假设字符的编码值在0~255之间)。然后遍历str1,统计每种字符出现的数量。然后再遍历str2,每遍历到一个字符,都在map中把词频减下来,如果减少后的值小于0,直接返回false。如果遍历完str2也没出现过负值,则返回true。
public boolean isDeformation(String str1, String str2) {
if (str1 == null || str2 == null || str1.length() != str2.length()) {
return false;
}
char[] chas1 = str1.toCharArray();
char[] chas2 = str2.toCharArray();
int[] map = new int[256];
for (int i = 0; i < chas1.length; i++) {
map[chas1[i]]++;
}
for (int i = 0; i < chas2.length; i++) {
if (map[chas2[i]]-- == 0) {
return false;
}
}
return true;
}
判断两个字符串是否互为旋转词
《程序员代码面试指南》第78题 P254 难度:士★☆☆☆
本题看了题解后才发现自己做错了,不过牛客上居然全通过。。
核心思路就是:如果a和b长度不一样,直接返回false;长度一样,则将2个b拼接在一起形成大字符串b2,然后看b2中是否包含a就行。
public boolean isRotation(String a, String b) {
if (a == null || b == null || a.length() != b.length()) {
return false;
}
String b2 = b + b;
return getIndexOf(b2, a) != -1;
}
书上说getIndexOf函数是KMP算法的实现,解决匹配问题,时间复杂度为O(N)。不过我看牛客上用一个b2.contains(a)就行了。。
将整数字符串转成整数值
题目:将整数字符串转成整数值
《程序员代码面试指南》第79题 P255 难度:尉★★☆☆
这题也很简单,秒想出来。这里介绍书上的解法:
首先检查str是否符合日常书写的整数形式:
(具体情况不再用文字一一赘述,直接看代码)
public boolean isValid(char[] chas) {
if (chas[0] != '-' && (chas[0] < '0' || chas[0] > '9')) {
return false;
}
if (chas[0] == '-' && (chas.length == 1 || chas[1] == '0')) {
return false;
}
if (chas[0] == '0' && chas.length > 1) {
return false;
}
for (int i = 1; i < chas.length; i++) {
if (chas[i] < '0' || chas[i] > '9') {
return false;
}
}
return true;
}
然后进行转换过程:
生成4个变量(当前字符所代表的数字的负数形式('0'-a)记为cur):① 布尔型常量posi,表示转换的结果是负数还是非负数;② 整型常量minq=Integer.MIN_VALUE/10(-214748364),如果在加上cur之前,res小于minq,则res*10后一定会溢出;③ 整型常量minr=Integer.MIN_VALUE%10(-8),如果res等于minq,但是cur小于minr,即-9<-8,那么res加上cur后一定会溢出(-2147483649);④ 整型变量res,转换的结果。
最后,如果res=-2147483648并且posi为true(正数),那么转换成正数后也会溢出。溢出的情况都返回0。
具体过程见书P257,代码如下:
public int convert(String str) {
if (str == null || str.equals("")) {
return 0; // can not convert
}
char[] chas = str.toCharArray();
if (!isValid(chas)) {
return 0; // can not convert
}
boolean posi = chas[0] == '-' ? false : true;
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 < chas.length; i++) {
cur = '0' - chas[i];
if ((res < minq) || (res == minq && cur < minr)) {
return 0; // can not convert
}
res = res * 10 + cur;
}
if (posi && res == Integer.MIN_VALUE) {
return 0; // can not convert
}
return posi ? -res : res;
}