String 有趣简单的编程题

导读:本篇文章讲解 String 有趣简单的编程题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

String 有趣简单的编程题

在这里插入图片描述

每博一文案

师父说: 世上没有真正的感同身受,也没有谁能完全做到将心比心,我们一路走来。
慢慢的学会了收敛情绪,越成熟越沉默,有些人,背负沉重的压力,却从来不敢说累,
有些话吗,不是不想对人说,而是说了压根没人懂,事情没发生在自己身上,别人永远不懂
你有多痛,越是在乎别人的看法,越容易忽略自己的感受,于是越来越沉默,越来越不想说。
所有苦都自己杠,所有的泪都自己咽,能自己杠的,就别声张,能自己做的,就别求人,
谁都靠不住,除非你有用,等风来,不如追风去,靠别人,不如靠自己。
没有谁会无条件对你好,也没有谁能保证待你如初,把希望寄托在别人身上,
到头来受伤的还是自己,有时尽心尽力做事,最后却为了他人做了嫁衣,有时掏心掏肺对人好
,最后却换来惨痛的结局。生活中多的是等着看你笑话的人,而真正关心你的人没几个,被
伤的次数多了,便知道要将心藏好,无心便无痛,无痛便无敌。
人总要学会自己长大,你若不坚强,懦弱给谁看,宁可让人觉得没心没肺,也不要让人觉得可怜卑微。
人生如逆旅,你我皆行人,人生不如意十之八九,可与人言,却无二三,快乐分享错了人,就成了显摆。
悲伤倾诉错了人,就成了矫情,每个人都有别人不懂的苦与乐,再幸福的人,内心也有无奈难处,
再风光的人,背后也有寒凉苦楚,不要再寂寞的时候谈感情,不要在孤独的时候找安慰,越成熟的人就越沉默。
因为他忙着独自奋力前行,快乐不难,只要内心简单,幸福容易,只要学会珍惜,无奈前路是顺是逆,
无论生活是风是雨,坚持到底,才算不辜负自己,冷暖自知,就是最好的活法。
                                         ——————   一禅心灵庙语


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。

前提是,两个字符串中只有一个最大相同的子串

思路:

  1. 首先确定好,哪个是主串,哪个是子串,长的为主串,短的为子串
  2. 逆向思维:通过不断变化子串,使用 contains()对象方法 判断子串是否在主串中存在,存在返回 true,不存在返回 false
  3. 通过不断变化子串:一旦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. 题目四 : 金额格式(将阿拉伯数字,转换为汉字的大写数值)

在这里插入图片描述

思路:

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

在这里插入图片描述

  1. 获取到对应汉字数字的大写,将其拼接到对应的字符串中,注意:因为我们的 money 输入的金额的数值是从最后面开始获取的,也就是个位数开始的,所以我们拼接的时候,要将个位数的数值拼接到最后面,依次是十位数的数值。
  2. 将不足七位数的补 零
  3. 同样创建一个存储 数值单位的 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 码表如下图所示:

img

我们可以观察到 :

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

思路:

  1. 创建一个脏话的数据库信息 String 数组。
  2. 循环遍历存储脏话的数据库,用于判断所说的脏话,并进行替换。
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. 总结:

  1. 灵活使用 String 中方法,实现对应的操作,提高开发效率。
  2. 对应String 字符串的频繁拼接,建议使用 StringBuffer / StringBuild 替换了。
  3. 理解 ASCII 码表中的 数字字符 char 转换为 int 的数值的方式: (int)5 + ‘0’(char) = 5 + 48 = 53, 5 = 53 -48

8. 最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!


在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/82984.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!