数据结构与算法学习——字符串相关问题

简介: 数据结构与算法学习——字符串相关问题

数据结构与算法学习——字符串相关问题


目录

博主介绍

前言

String、StringBuffer与StringBuilder的区别

1.1、String类

1.2、StringBuffer类和StringBuilder类

1.3、总结

找出字符串中出现最多次的字符和出现的次数

找出字符串中第一次重复出现的字符

两个大数之和


💫点击直接资料领取💫

目录

博主介绍


💂 个人社区:CSDN全国各地程序猿


🤟作者介绍:中国DBA联盟(ACDU)成员,CSDN全国各地程序猿(媛)聚集地管理员。目前从事工业自动化软件开发工作。擅长C#、Java、机器视觉、底层算法等语言。2019年成立柒月软件工作室,2021年注册苏州凯捷智能科技有限公司


💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦


💅 有任何问题欢迎私信,看到会及时回复


👤 微信号:stbsl6,微信公众号:苏州程序大白


前言


ee3c916523fe4972a1d774afd5159d97.png


String、StringBuffer与StringBuilder的区别


1.1、String类


分析源码可知,String对象的内容是存储在一个char数组中,且这个数组使用final修饰,这也是String对象不可变的原因。当进行字符串拼接时,虚拟机会新建一个字符串对象,然后将新的字符串对象赋值给原来的引用,而不是真的修改了原来字符串对象的值。


字符串重写了Object父类的equals方法。


1.2、StringBuffer类和StringBuilder类


这两个类均继承于AbstractStringBuilder类,但分析源码可知StringBuffer的方法都添加了synchronized关键词进行修饰,所以StringBuffer是线程安全的,而没有使用synchronized修饰方法的StringBuilder是线程不安全的,但StringBuilder的速度要远远高于StringBuffer,所以在能保证线程安全的情况下,StringBuilder的优先级要高于StringBuffer。


1.3、总结


String是一个final修饰的类,所有的属性也是final的,所以String具有不可变性,也就是对字符串的操作,如拼接、剪切都会产生新的String对象。


StringBuffer本质是一个线程安全的可修改字符串序列。因为保证线程安全,所以会带来额外的性能消耗。


StringBuilder本质上和StringBuffer没有区别,但是StringBuilder去掉了线程安全部分提高了操作效率,是绝大部分情况下字符串拼接的首选。


如果确定拼接字符串会发生多次,并且长度可预计,那么可以在开始的时候指定合适的大小,避免数组扩容造成的开销。


找出字符串中出现最多次的字符和出现的次数

遍历字符串,并使用一个HashMap来存储出现字符及出现的次数,以字符为key,次数为value。解题思路如下:


假定字符串中出现最多的字符maxCode为当前字符串的第一个元素,出现次数maxCount初始化为0。


遍历字符串,判断当前字符是否在hashmap的key中,如果包含,令次数+1,否则将该字符为key,1为value放入hashmap中。


判断maxCount和当前字符出现次数的关系,如果maxCount小于当前字符出现次数,就令maxCode = 当前字符,然后更新maxCode,最后返回maxCode和maxCount即可。


实现代码如下:


/***
 * 找出字符串中出现最多次的字符和出现的次数
 * @param str 目标字符串
 * @return 以maxCode为键、maxCount为值的map
 */
public static Map<Character, Integer> findMostCodeAndCount(String str) {
    char maxCode = str.charAt(0);
    int maxCount = 0;
    Map<Character, Integer> map = new HashMap<>();
    for (int i = 0; i < str.length(); i++) {
        Character currentCode = str.charAt(i);
        Integer count = map.get(currentCode);
        if(count == null) {
            count = 1;
        } else {
            count++;
        }
        map.put(currentCode, count);
        if(maxCount < count) {
            maxCode = currentCode;
            maxCount = count;
        }
    }
    Map<Character, Integer> result = new HashMap<>();
    result.put(maxCode,maxCount);
    return result;
}


测试代码:


String str = "abcacba";
Map result = findMostCodeAndCount(str);
System.out.println(result);


结果:


89d4c592994e49b2846cc933c5a154ee.png


找出字符串中第一次重复出现的字符


使用一个HashSet来解决问题,由于Set有不允许元素重复的性质,Set的add方法在添加重复值是会返回false,所以我们可以用这个性质来判断元素是否重复。


实现代码如下:


/***
 * 找出字符串中第一次重复出现的字符
 * @param str 目标字符串
 * @return 返回第一次重复的字符
 */
public static Character getFirstRepeat(String str) {
    Set<Character> set = new HashSet<>();
    Character result = null;
    for (int i = 0; i < str.length(); i++) {
        Character currentCode = str.charAt(i);
        if(!set.add(currentCode)) {
            result = currentCode;
            break;
        }
    }
    return result;
}


测试代码:


String str = "abcacba";
Character result = getFirstRepeat(str);
System.out.println(result);


结果:


ec02261daede404c82550658a0bb498c.png


两个大数之和


题目描述:现在有两个数,位数均超过1000位,例如:
String a = “123343432…”
String b = “3974928374928…”
这两个大数无法转换为Integer计算,所以我们使用两个数组来存储这两个数,然后进行计算。


解题思路如下:


设这两个数中大的数的位数位m,则结果的最大位数位m+1。


用一个int数组来存储结果。


实现代码如下:


/***
 * 编程两个大数之和
 * @param num1
 * @param num2
 * @return
 */
public static String sumOfBigNum(String num1,String num2) {
    char[] largeArray = null;
    char[] smallArray = null;
    if(num1.length() >= num2.length()) {
        largeArray = num1.toCharArray();
        smallArray = num2.toCharArray();
    } else {
        largeArray = num2.toCharArray();
        smallArray = num1.toCharArray();
    }
    int[] res = new int[largeArray.length + 1];
    for (int i = 0; i < largeArray.length; i++) {
        res[i] = largeArray[largeArray.length - i - 1] - '0';
    }
    for (int i = 0; i < smallArray.length; i++) {
        res[i] += smallArray[smallArray.length - i - 1] - '0';
    }
    for (int i = 0; i < res.length - 1; i++) {
        if(res[i] > 9) {
            res[i + 1] += res[i] / 10;
            res[i] %= 10;
        }
    }
    StringBuilder stringBuilder = new StringBuilder();
    for (int i = res.length - 1; i >= 0; i--) {
        stringBuilder.append(res[i]);
    }
    String result = stringBuilder.toString();
    if(result.startsWith("0")) {
        result = result.substring(1);
    }
    return result;
}


测试代码:


String num1 = "12345";
String num2 = "56756";
Integer n1 = Integer.valueOf(num1);
Integer n2 = Integer.valueOf(num2);
Integer sum = n1 + n2;
System.out.println("计算机计算结果为:" + sum);
System.out.println("函数计算结果位:" + sumOfBigNum(num1,num2));


结果:


81b58f8a77de45d2a65d1a8901cc8e25.png

相关文章
|
22天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
13天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
35 6
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
14天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。

热门文章

最新文章

下一篇
无影云桌面