“高级Java编程复习指南:深入理解并发编程、JVM优化与分布式系统架构“


我的个人主页

接下来我将方享四道由易到难的编程题,进入我们的JavaSE复习之旅。

1:大小写转换------题目链接

解题思路:

在ASCII码表中,⼤写字⺟A-Z的Ascii码值为65- 90,⼩写字⺟a-z的Ascii码值为97-122。每个字 ⺟⼤⼩写之间的关系为:⼩写字⺟的ascii码值 - 32 = ⼤写字⺟的ascii码值。因此可以利⽤这⼀ 特性,先判断字⺟为⼤写还是⼩写,之后根据 ⼤⼩写决定如何进⾏转换。

参考代码:

java 复制代码
​
public class Main {
     public static void main(String[] args) {
          Scanner in = new Scanner(System.in);
          while(in.hasNextLine()){
              String line = in.nextLine();
               if (Character.isLowerCase(line.charAt(0))){
              //if (line.charAt(0) >= 97 && line.charAt(0) <= 122){
                     char c = (char) (line.charAt(0) - 32);
                         System.out.println(c);
              }else{
                 char c = (char) (line.charAt(0) + 32);
                 System.out.println(c);
          }

​

调试结果如图所示:


2. 斐波那契数列------题目链接
解题思路:

由题意可知,斐波那契数列的的第⼀项和第⼆项为1,后续项的⼤⼩为前⼀项和前两项的和,

第三项=第⼀项+第⼆项;
第四项=第⼆项+第三项;
以此类推。
故可以考虑使⽤递归的思路去求第n项的⼤⼩。
例如求第5项时,⼤致图解如下:

参考代码 :

java 复制代码
public class Main2{
     public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
         int ret = fib(in.nextInt());
         System.out.println(ret);
     }
         public static int fib(int i) {
         int arr[] = new int[i+1];
 //这⾥让的返回值为了⽅便理解,我们数组的0下标并不做任何有意义的计算(相当于舍弃
了),⽅便后续返回结果的时候直接返回i下标的值即可。
             arr[0] = 0;
             arr[1] = 1;
             arr[2] = 1;
             for (int j = 3; j <= i; j++) {
             arr[j] = arr[j - 1] + arr[j - 2];
         }
         return arr[i];
     }

调试结果如图所示:

3. 删除公共字符 ------题目链接

解题思路:
这道题的意思是让我们在字符串1(暂记为str1)中删除字符串2(暂记为str2)中包含的字⺟
(注意:空格不会计算在内)此时同学们可能会疑惑⼀个问题,需要注意⼤⼩写问题嘛?再
仔细阅读题⽬的意思,单纯的只是让咱们把str1中包含的str2的字⺟删掉,并不涉及到不区分
⼤⼩写的问题,所以我们还是要区分⼤⼩写问题的。我们可以对str1中的字符串进⾏遍历,
借助⼀个StringBuilder对象进⾏结果的拼接,获取到每个字符后(空格不计,直接进⾏拼
接)去在str2当中去看看有没有相同的字⺟,如果没有,则表⽰不⽤删除,并将其拼接
StringBuilder对象中,如果有,则不进⾏拼接。

参考代码:

java 复制代码
1 import java.util.Scanner;
2
3 
4 public class Main {
5     public static void main(String[] args) {
6      Scanner in = new Scanner(System.in);
7         // 注意 hasNext 和 hasNextLine 的区别
8         while (in.hasNextLine()) { // 注意 while 处理多个 case
9         String str1 = in.nextLine();
10         String str2 = in.nextLine();
11         System.out.println(func(str1,str2));
12         }
13     }
14
15     private static String func(String str1, String str2) {
16         StringBuilder stringBuilder = new StringBuilder();
17         for (int i = 0; i < str1.length(); i++) {
18         char c = str1.charAt(i);
19         boolean flag = true;
20         if (c != ' '){
21         for (int j = 0; j < str2.length(); j++) {
22         if (c == str2.charAt(j)){
23             flag = false;
24                 break;
25         }
26     }
27 }
28         if (flag == true){
29             stringBuilder.append(c);
30     }
31 }
32         return String.valueOf(stringBuilder);
33     }
34 }

调试结果:

解题方法二:

我们可以遍历str1这个字符串,拿到每个字符,看str2当中是否包含当前字符,如果不包含,
难么就拼接到StringBuilder对象当中。直到拿到最后的结果。
难点:

  1. String本⾝不包含,如何判断⼀个字符在不在当前字符串当中的⽅法。只有⼀个contains
    ⽅法。
    该⽅法原型如下:
java 复制代码
public boolean contains(CharSequence s) {
     return indexOf(s.toString()) >= 0;
 }

我们可以看到参数并不是char类型。那么如何处理呢?请看如下代码:

java 复制代码
if(!str2.contains(ch+"")) {
     sb.append(ch);
 }

这⾥只要字符拼接上⼀个空的字符串即可达到⽬标.
参考代码:

java 复制代码
public class Main {
 public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
         // 注意 hasNext 和 hasNextLine 的区别
         while (in.hasNextLine()) { // 注意 while 处理多个 case
            String str1 = in.nextLine();
             String str2 = in.nextLine();
             String ret = func(str1,str2);
             System.out.println(ret);
             }
         }
public static String func(String str1,String str2) {
         StringBuilder sb = new StringBuilder();
        for(int i = 0;i < str1.length();i++) {
             char ch = str1.charAt(i);
            if(!str2.contains(ch+"")) {
                sb.append(ch);
                 }
             }
        return sb.toString();
         }
 }

4. 输⼊两个字符串a和b,字符串内容为⼆进制数字,求两个字符串相加的结果, 加法计算⽅法以⼆进制⽅式计算,并返回对应的字符串结果。要求程序尽可能 的⾼效。
题目链接

输⼊描述:
输⼊两个字符串,如"1101", "1100"
输出描述: "11001"
解题思路:

  1. 正常数字相加运算⽅式为:
    124
    456 +

580
从后往前进⾏计算,进位也是从后往前。所以,我们应该把输⼊的字符串进⾏逆序。
2. "124" + "456" 这两个字符串逆置后进⾏相加的进位
"421"
"654" +

085 最后将结果字符串逆置即可
3. 进位只有⼀种情况,对应位上都是字符1.

参考代码:

java 复制代码
import java.util.Scanner;
         public class Main{

         public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
         // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String a = in.next();//
             String b = in.next();
             System.out.println(add(a, b));
             }
        }
 public static String add(String a, String b) {
         StringBuilder sb = new StringBuilder();
         int lenA = a.length();
         int lenB = b.length();
        int max = Math.max(lenA, lenB);
         StringBuilder stringBuilderA = new StringBuilder(a).reverse();
         StringBuilder stringBuilderB = new StringBuilder(b).reverse();
        // 0110 1111

       boolean isCarry = false;
         for (int i = 0; i < max; i++) {
             //这⾥没定义谁最⼤,可能字符串A先⾛完,也可能字符串B先⾛完
             //只需要补0就⾏
             char aChar = i >= lenA ? '0' : stringBuilderA.charAt(i);
             char bChar = i >= lenB ? '0' : stringBuilderB.charAt(i);
             if (aChar == '1' && bChar == '1') {
                 sb.append(isCarry ? '1' : '0');
                isCarry = true;
               } else if (aChar == '0' && bChar == '0') {
                 sb.append(isCarry ? '1' : '0');
               isCarry = false;
                } else {
                 sb.append(isCarry ? '0' : '1');
                 }
            }
        if (isCarry) sb.append("1");
         return sb.reverse().toString();
         }
}

调试结果:

"今日JavaSE复习圆满收官,编程之路再启新程!"

相关推荐
煎饼学大模型6 小时前
Agent 的“大脑-手“解耦架构:当推理层和工具执行层各自独立演进
数据库·人工智能·oracle·架构·agent
头发还在的女程序员6 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats6 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我123457 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥9 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.9 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔11 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊11 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
韩楚风12 小时前
【参天引擎】一次宕机后的数据恢复,让我把 Cantian 持久化与恢复的六大机制全搞明白了
服务器·网络·数据库·分布式·mysql·架构·cantian
Slice_cy12 小时前
Mint 自研框架设计与实现:从重复开发走向配置驱动(五)
前端·后端·架构