【LeetBook】初级算法案例+java代码实现(字符串篇(1))

简介: 【LeetBook】初级算法案例+java代码实现(字符串篇(1))

反转字符串

723a55a939dc4784a23f761f8a13302d.png


代码:

public void reverseString(char[] s) {
    char temp;
    int length=s.length;
    //注意i<length/2,即只需两边交换即可
    for(int i=0;i<length/2;i++){
        temp=s[i];
        s[i]=s[length-1-i];
        s[length-1-i]=temp;
    }
}


整数反转


fcfe3703ac444de98eee984c5fe7fba2.png


代码:

public int reverse(int x) {
    //判断有没有负号
    int flag = x > 0 ? 1 : -1;
    //把符号提出来
    x = Math.abs(x);
    try {
        //将字符串转化之后乘以flag,即还原符号
        return Integer.valueOf(new StringBuffer(String.valueOf(x)).reverse().toString()) * flag;
    } catch (NumberFormatException e) {
        return 0;
    }
}


字符串的第一个唯一字符


9419dcfb19354363902a4f321f68717c.png

代码:

public int firstUniqChar(String s) {
    for (int i = 0; i < s.length(); i++) {
        char t = s.charAt(i);
        //当第一次出现该字符的索引和最后一次出现该字符的索引一致,说明该字符只有一个
        if (s.indexOf(t)==s.lastIndexOf(t)){
            return i;
        }
    }
    //如果上面没有返回,说明字符串的长度为0,或者每一个字符都有重复
    return -1;
}


有效的字母异位词


代码:

public boolean isAnagram(String s, String t) {
    //若长度不相同,肯定使false
    if (s.length() != t.length()) {
        return false;
    }
    char[] sCharArr = s.toCharArray();
    char[] tCharArr = t.toCharArray();
    //数组的下表可以用字符来表示,因为后期会被自动转化为合适的索引
    //其实字符可以通过ASCII编码表转换为数字,而标准ASCII码字符集总共的编码有128个,所以声明数组的长度为128
    int[] temp = new int[128];
    for (char c : sCharArr) {
        temp[c]++;
    }
    for (char c : tCharArr) {
        temp[c]--;
    }
    for (int i = 0; i < temp.length; i++) {
        if (temp[i] != 0) {
            return false;
        }
    }
    return true;
}


验证回文串

代码:


public boolean isPalindrome(String s) {
    if (s.length() == 0) {
        return true;
    }
    //先将字符串的所有字母转化为小写
    s = s.toLowerCase();
    for (int i = 0, j = s.length() - 1;i < j; i++, j--) {
        //跳过不是数字和字母的其他字符
        while (i < j && !Character.isLetterOrDigit(s.charAt(i))) {
            i++;
        }
        //跳过不是数字和字母的其他字符
        while (i < j && !Character.isLetterOrDigit(s.charAt(j))) {
            j--;
        }
        if (s.charAt(i) != s.charAt(j)) {
            return false;
        }
    }
    return true;
}


字符串转换整数 (atoi)

307a0d877da7441c911bf72fd599ad17.png


57065d70613f44d3860d8d21cb7a7d0e.png


代码:

public int myAtoi(String s) {
    if (s.length() == 0) {
        return 0;
    }
    char[] sCharArr = s.toCharArray();
    int index = 0;
    //读入字符串并丢弃无用的前导空格
    //跳过空格
    while (index<sCharArr.length&&sCharArr[index] == ' ') {
        index++;
    }
    // 字符串为全空格
    if (index == sCharArr.length) {
        return 0;
    }
    //检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
    int flag = 1;
    //如果该字符为'-','+',index++
    if (sCharArr[index] == '-' || sCharArr[index] == '+') {
        if (sCharArr[index++] == '-') {
            flag = -1;
        }
    }
    //读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
    String tempStr = "";
    while (index < sCharArr.length) {
        if (sCharArr[index] < '0' || sCharArr[index] > '9') {
            break;
        } else {
            tempStr += sCharArr[index];
        }
        index++;
    }
    //将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
    //如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
    //返回整数作为最终结果。
    if (tempStr.equals("")){
        return 0;
    }
    try{
        return Integer.valueOf(tempStr)*flag;
    } catch (NumberFormatException e) {
        return flag==1?Integer.MAX_VALUE:Integer.MIN_VALUE;
    }
}

由于小编如今面临苦逼的期末考试,先暂时更新一部分,感兴趣的同学可以上初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 (leetcode-cn.com)进行进一步的学习。


目录
相关文章
|
6天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
8天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
17天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
48 3
|
17天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
16天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
18天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
6月前
|
存储 XML 缓存
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
69 0
|
3月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
64 1
|
3月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
148 0
|
3月前
|
存储 Java