Loading

判断两个字符串是否互为变形词 & 判断两个字符串是否互为旋转词 & 将整数字符串转成整数值

判断两个字符串是否互为变形词

题目:判断两个字符串是否互为变形词

《程序员代码面试指南》第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;
}
posted @ 2022-04-03 21:01  幻梦翱翔  阅读(41)  评论(0)    收藏  举报