String 有趣简单的编程题

每博一文案
师父说: 世上没有真正的感同身受,也没有谁能完全做到将心比心,我们一路走来。
慢慢的学会了收敛情绪,越成熟越沉默,有些人,背负沉重的压力,却从来不敢说累,
有些话吗,不是不想对人说,而是说了压根没人懂,事情没发生在自己身上,别人永远不懂
你有多痛,越是在乎别人的看法,越容易忽略自己的感受,于是越来越沉默,越来越不想说。
所有苦都自己杠,所有的泪都自己咽,能自己杠的,就别声张,能自己做的,就别求人,
谁都靠不住,除非你有用,等风来,不如追风去,靠别人,不如靠自己。
没有谁会无条件对你好,也没有谁能保证待你如初,把希望寄托在别人身上,
到头来受伤的还是自己,有时尽心尽力做事,最后却为了他人做了嫁衣,有时掏心掏肺对人好
,最后却换来惨痛的结局。生活中多的是等着看你笑话的人,而真正关心你的人没几个,被
伤的次数多了,便知道要将心藏好,无心便无痛,无痛便无敌。
人总要学会自己长大,你若不坚强,懦弱给谁看,宁可让人觉得没心没肺,也不要让人觉得可怜卑微。
人生如逆旅,你我皆行人,人生不如意十之八九,可与人言,却无二三,快乐分享错了人,就成了显摆。
悲伤倾诉错了人,就成了矫情,每个人都有别人不懂的苦与乐,再幸福的人,内心也有无奈难处,
再风光的人,背后也有寒凉苦楚,不要再寂寞的时候谈感情,不要在孤独的时候找安慰,越成熟的人就越沉默。
因为他忙着独自奋力前行,快乐不难,只要内心简单,幸福容易,只要学会珍惜,无奈前路是顺是逆,
无论生活是风是雨,坚持到底,才算不辜负自己,冷暖自知,就是最好的活法。
                                         ——————   一禅心灵庙语
文章目录
- String 有趣简单的编程题
- 每博一文案
- 1. 题目一:字符串的反转
- 2. 题目二: 获取subStr 子串 在 mainStr 主串 中出现的次数
- 3. 题目三:获取两个字符串中最大的子串
- 4. 题目四 : 金额格式(将阿拉伯数字,转换为汉字的大写数值)
- 5. 题目五: 从身份征中读取信息
- 6. 题目六: 脏话替换
- 7. 总结:
- 8. 最后:
 
1. 题目一:字符串的反转
将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”gfedcba”
方式一:
思路:
首先使用toCharArray 对象方法将字符串转换为 字符数组,
再将字符数组 中的字符,循环遍历,前后字符反转。
最后将字符数组作为参数,转换为 String 字符串对象
public class StringExam {
    public static void main(String[] args) {
        String str = "abcdefg";
        System.out.println("反转前: " + str);
        // 1.将 String 转换为字符数组
        char[] chars = str.toCharArray();
        // 2. 循环前后反转
        int start = 0;
        int end = chars.length - 1;
        while (start <= end) {
            char temp = chars[end];
            chars[end] = chars[start];
            chars[start] = temp;
            end--;
            start++;
        }
        // 3. 转换好的字符数组,作为参数创建 String 对象
        String strCopy = new String(chars);
        System.out.println("反转后: " + strCopy);
        
    }
}

方式二:
思路:
拼接字符串:因为涉及到对字符串频繁的拼接操作,所以使用 StringBuffer / StringBuilder
将字符串 “abcdefg” 依次从最后一个字符串取单个字符,使用 Cha() 方法,再使用 apped()方法 拼接上就反转了

public class StringExam {
    public static void main(String[] args) {
        String str = "abcdefg";
        System.out.println("反转前: " + str);
        // 1. 创建一个空字符串的 StringBuilder 用于拼接,设置容量为 str.length()的长度的大小。
        // 减少扩容次数,提高效率
        StringBuilder stringBuilder = new StringBuilder(str.length());
        int index = str.length() - 1;
        while (index >= 0) {
            // 2. 从最后面依次取出 str 字符串的字符,拼接上
            stringBuilder.append(str.charAt(index));
            index--;
        }
        System.out.println("反转后: " + stringBuilder);
        
    }
}

2. 题目二: 获取subStr 子串 在 mainStr 主串 中出现的次数
判断子串 “abc” 在 中主串 “abcabcabchelloabcworldabc” 出现了多少次。
方式一:
思路:
当 主串的字符串长度 >= 子串的字符串长度,才需要寻找,因为但 主串的长度都 < 子串的长度,那么必然没有子串了,0 个子串不用找了。使用 indexOf() 的对象方法,每在主串中找到一个返回子串所在的索引下标,再限定范围跳过该子串,继续在主串在中找,
每找到一个计数。

public class StringExam {
    public static void main(String[] args) {
        String mainStr = "abcabcabchelloabcworldabc";
        String subStr = "abc";
        int count = 0;
        int index = 0;
        // 1. 首先判断,主串的长度是否 >= 子串,小于的话就是,主串中不存在子串的内容,0个
        if (mainStr.length() >= subStr.length()) {
            // 2. 循环遍历: ,indexOf()找子串所在的下标位置,返回 -1表示不存在
            while ((index = mainStr.indexOf(subStr, index)) != -1) {
                count++;
                // 3. 跳过该子串的位置,向后继续找,直到子串不存在了
                index = index + subStr.length();
            }
        }
        // 循环结束,找完了
        System.out.println(count);
    }
}

方式二:
思路:
思路和方式一是一样的,不同的是,这里我们将 使用substring(截断)方法,找到一个子串,就截断主串,再从截断的字符串中找
public class StringExam {
    public static void main(String[] args) {
        String mainStr = "abcabcabchelloabcworldabc";
        String subStr = "abc";
        int count = 0;
        int index = 0;
        // 1. 当 主串的长度 >= 子串才有,子串的存在
        if (mainStr.length() >= subStr.length()) {
            // 2. indexOf()返回子串在主串的所在索引下标位置
            while ((index = mainStr.indexOf(subStr, index)) != -1) {
                count++;
                // 3. 找下个一个,通过截断找到的一个长度,向后找: index(找到的子串下标位置) + 子串的长度
                mainStr = mainStr.substring(subStr.length(), mainStr.length());
            }
        }
        // 4. 循环结束
        System.out.println(count);
    }
}

3. 题目三:获取两个字符串中最大的子串
str1 = "abcwerthelloyuiodef“;str2 = “cvhellobnm” 提示:将短的那个串进行长度依次递减的子串与较长的串比较。public boolean contains(CharSequence s)当且仅当此字符串包含指定的 char 值序列时,返回 true。
前提是,两个字符串中只有一个最大相同的子串
思路:
- 首先确定好,哪个是主串,哪个是子串,长的为主串,短的为子串
- 逆向思维:通过不断变化子串,使用 contains()对象方法 判断子串是否在主串中存在,存在返回 true,不存在返回 false
- 通过不断变化子串:一旦contains()返回 true,该子串就是最长的子串。变化规律如下图:

public class StringExam {
    public static void main(String[] args) {
        String str1 = "abcwerthelloyuiodeff";
        String str2 = "cvhellobnm";
        // 1. 找到主串,子串,长的为主串,短的为子串
        String maxStr = str1.length() > str2.length() ? str1 : str2;
        String minStr = str1.length() < str2.length() ? str1 : str2;
        int length = minStr.length();   // for遍历次数是子串的长度,因为子串的长度在一点一点的减少
        // 2.将子串的长度,一点一点的减小,与主串比较判断是否存在
        for (int i = 0; i < length; i++) {
            int x = 0;
            int y = 0;
            // case: 1.完整的子串比较判断,2.去开头子串一个字符比较,3.去结尾子串一个字符比较,4.去开头和结尾一个字符比较
            for (x = 0, y = length - i; y <= length; y++, x++) {
                String subStr = minStr.substring(x, y);
                if (maxStr.contains(subStr)) {
                    System.out.println(subStr);  // 找到了最长的子串
                    return;
                }
            }
        }
    }
}

如果存在多个相同最大长度的子串:
处理方式,找到 子串以后,不要 return 返回,而是存储起来就可以了。
public class StringExam {
    public static void main(String[] args) {
        String str1 = "abcwerthelloyuiodeffhellohellohello";
        String str2 = "cvhellobnm";
        // 存储多个相同的子串
        StringBuilder stringBuilder = new StringBuilder();
        String maxStr = str1.length() >= str2.length() ? str1 : str2;
        String minStr = str1.length() < str2.length() ? str1 : str2;
        // 从短子串比较
        int length = minStr.length();
        boolean sign = false;
        for (int i = 0; i < length; i++) {
            int x = 0;
            int y = 0;
            for (x = 0, y = length - i; y <= length; x++, y++) {
                // case:1.完整子串,2.去子串开头,3.去子串结尾,4.去子串开头,结尾
                String subString = minStr.substring(x, y);
                if (maxStr.contains(subString)) {
                    stringBuilder.append(subString + ",");
                }
            }
            // 当存储最长子串的长度不为 0,停止。因为最长相同的子串都存储完了
            if (stringBuilder.length() != 0) {
                break;
            }
        }
        System.out.println(stringBuilder);
    }
}
4. 题目四 : 金额格式(将阿拉伯数字,转换为汉字的大写数值)

思路:
- 得到 输入的金额: money 中的每个数值,方便转换为对应的中文大写数值
- 通过取模 % 运算获取到 money 的最后一个数值。以及 / 除法 去掉已经获取到的最后一个数值,向前取值
- 定义一个String 字符数组: 存储汉字中的数字的大写。再通过从 money获取到的单个数值访问存储汉字数字大写数组的下标,获取到对应汉字数字大写,如下图示:
String[] arr = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

- 获取到对应汉字数字的大写,将其拼接到对应的字符串中,注意:因为我们的 money 输入的金额的数值是从最后面开始获取的,也就是个位数开始的,所以我们拼接的时候,要将个位数的数值拼接到最后面,依次是十位数的数值。
- 将不足七位数的补 零
- 同样创建一个存储 数值单位的 String 字符串,依次插入到拼接的字符串当中
 String[] arrs = {"佰","拾","万","仟","佰","拾","元"};
import java.util.Scanner;
public class StringExam {
    public static void main(String[] args) {
        // 1.键盘输入一个金额
        Scanner scanner = new Scanner(System.in);
        int money = 0;
        while (true) {
            System.out.print("请输入一个金额: ");  // 123
            money = scanner.nextInt();
            if (money >= 0 && money <= 99999999) {
                break;
            } else {
                System.out.print("金额无效,重新输入: ");
            }
        }
        // 定义一个变量,用来表示大写,并用于拼接大写
        String moneyStr = "";
        // 2. 获取到 money 输入的金额的最后的数值
        while (money > 0) {
            int index = money % 10;  // 获取money 最后一个数值,个位上的数值
            money = money / 10;  // 继续向前取,十位上的数值
            // 3.把转换之后的大写连接上 moneyStr中
            // moneyStr = moneyStr + capitalNumber;
            // 第一次循环是: 叁
            // 第二次循环是:  叁贰
            // 第三次循环是:  叁贰壹
            // 反一下就可以了,将最后取到的数值放到后面
            moneyStr = getCapitalNumber(index) + moneyStr;
            System.out.println(moneyStr);
        }
        // 4. 不足 7 位数值补 0
        int count = 7 - moneyStr.length(); // 补全7位数值,不足补零
        for (int i = 0; i < count; i++) {
            moneyStr = "零" + moneyStr;
        }
        System.out.println(moneyStr);
        // 5. 将各个单位插入到对应的位置当中
        // 定义一个数组表示单位:
        String[] arrs = {"佰","拾","万","仟","佰","拾","元"};
        String result = "";
        for(int i = 0; i < moneyStr.length(); i++) {
            char c = moneyStr.charAt(i);  // 将对应的中文大写数值取出来,放入到对应的单位当中去
            result = result + c + arrs[i];
        }
        // 最后打印
        System.out.println(result);
    }
    // 将输入的埃利伯数字转换位中文的大写数字
    // 思路定义一个方法把中文的数字存储起来
    // 阿拉伯的数值 与 中文的大写的数值在下标上相对应上,。
    public static String getCapitalNumber(int number) {
        // 定义中文数字的数组
        String[] arr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        // 返回对应埃莱伯数值的 转换为对应的 中文大写的数值
        return arr[number];
    }
}

5. 题目五: 从身份征中读取信息
从身份证: 321281202001011234 获取到其中的 出生年月日,以及性别
思路:
明白身份证上的各个区间上数值的意思:
身份证号码是由18位数字组成的,他们分别表示:
前1、2位数字表示:所在省份的代码。
前3、4位数字表示:所在城市的代码。
前5、6位数字表示:所在区县的代码
第7~14位数字表示:出生年、月、日,7、8、9、10位是年,11、12位是月,13、14位是日
其中第17位数字表示性别,奇数表示男性,偶数表示女性
18位数字是校检码,校检码可以是0~9的数字,有时也用x表示,X是罗马数字的10。
知道了身份证的信息后,我们就可以使用 substring() 对象方法截断获取到我们想要的信息
还有一个问题:就是将 字符'3'数值 转换为 int 的数值 我们观察 ASCII 码表如下图所示:

我们可以观察到 :
char ‘0’ 对应 int 十进制 48
char ‘1’ 对应 int 十进制 49 ,
char ‘2’ 对应 int 十进制 50,
char ‘3’ 对应 int 十进制 51 ,
char ‘4’ 对应 int 十进制 52 ,
char ‘5’ 对应 int 十进制 53 ,
**(int)5 + ’0‘(char) = 5 + 48 = 53,5 = 53 - 48 就成了 int 类型的数值了。 **
public class StringExam {
    public static void main(String[] args) {
        // 1.定义一个字符串的记录的身份证号码
        String id = "321281202001011234";
        // 2. 获取到年月日
        String year = id.substring(6, 10);   // 年
        String month = id.substring(10, 12); // 月
        String day = id.substring(12, 14);   // 日
        System.out.println("人物信息为: ");
        System.out.println(year + "年" + month + "月" + day + "日");
        // 3.  获取性别 (奇数为男性,偶数为女性);
        char gender = id.charAt(16);   // '3' --> 3
        // 将字符 '3' 转换为 数值 3
        // 利用ASCII码表进行转换
        // '0' -->  48
        // '1' --> 49
        // '2' --> 50
        // '3' --> 51
        // '9' + 0 = 48 + 9 = 57;
        // 9 = 57 -48 就成了int 类型的数值的
        int num = gender - 48;
        if (num % 2 == 0) {
            System.out.println("性别为 女");
        } else {
            System.out.println("性别为: 男");
        }
    }
}

6. 题目六: 脏话替换
定义一句 String类型的脏话 :“你玩的真好,SB”; 将其中的 SB 替换成 xxx
思路:
- 创建一个脏话的数据库信息 String 数组。
- 循环遍历存储脏话的数据库,用于判断所说的脏话,并进行替换。
public class StringExam {
    public static void main(String[] args) {
        String talk = "你玩的真好,SB";
        // 2.定义一个敏感的词库,用于判断是否有脏话,并替换
        String[] arr = {"TMD","CNM","SB","MLGB"};
        // 3. 循环遍历脏话数据库,并进行替换
        for (int i = 0; i < arr.length; i++) {
            talk = talk.replace(arr[i],"xxx");
        }
        // 替换完后
        System.out.println(talk);
    }
}

7. 总结:
- 灵活使用 String 中方法,实现对应的操作,提高开发效率。
- 对应String 字符串的频繁拼接,建议使用 StringBuffer / StringBuild 替换了。
- 理解 ASCII 码表中的 数字字符 char 转换为 int 的数值的方式: (int)5 + ‘0’(char) = 5 + 48 = 53, 5 = 53 -48
8. 最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!

![[python刷题模板] 树的直径/换根DP](https://img-blog.csdnimg.cn/85dcd56d73d543b589199e198921d1f0.png)


![[QMT]04-在QMT之外调用xtquant直接编写策略](https://img-blog.csdnimg.cn/img_convert/3b4021d7cde26ee778b08d28013e9bb4.png)















