Java 控制语句:分支与循环

发布时间 2023-12-03 23:51:21作者: 粥粥alg

第一章:分支结构

1.1条件语句

1、if 语句
2、switch case 语句

switch(expression){
    case value :
       //语句
       break; //可选
    case value :
       //语句
       break; //可选
    //你可以有任意数量的case语句
    default : //可选
       //语句
}

如果 case 语句块中没有 break 语句时,匹配成功后,从当前 case 开始,后续所有 case 的值都会输出。

1.2打印每月含有的天数

你的代码需要从标准输入流(控制台)中读入一个 String 的数组,保证数组的第一个元素是年份,第二个元素是月份,计算出结果并打印到标准输出流(控制台)中。

import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        String str = sca.nextLine();
        String[] strs = str.split(" ");
        int year = Integer.parseInt(strs[0]);
        int month = Integer.parseInt(strs[1]);
                switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            System.out.println("31 days");

            break;

        case 4:
        case 6:
        case 9:
        case 11:
            System.out.println("30 days");

            break;

        case 2:

            if ((((year % 4) == 0) && ((year % 100) != 0)) ||
                    ((year % 400) == 0)) {
                System.out.println("29 days");
            } else {
                System.out.println("28 days");
            }

            break;
        }
    }
}

1.3命中率评级

请从标准输入流(控制台)中获取一个自然数 n 表示学生投篮 100 次中命中的次数,请通过 System.out.println 语句输出命中率对应的评级。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        switch(n/10){
            case 10:
            System.out.println("A");
            break;
            case 9:
            System.out.println("A");
            break;
            case 8:
            System.out.println("B");
            break;
            case 7:
            System.out.println("C");
            break;
            case 6:
            System.out.println("D");
            break;
            default:
            System.out.println("E");
        }
    }
}

第二章:循环结构

2.1求最大公约数

给出两个整数 a 和 b,请计算 a 和 b 的最大公约数,通过 System.out.println 语句输出。

public class Main {
    public static void main(String[] args) {
        int a = Integer.parseInt(args[0]);
        int b = Integer.parseInt(args[1]);
        int num = Math.min(a, b);
        for (int i = num; i > 0; i--) {
            if (a % i == 0 && b % i == 0) {
                System.out.println(i);
                return;
            }
        }
    }
}

2.2for 循环

请从标准输入流(控制台)中获取一个正整数 n,并输出区间 [1,n] 内所有数的和。你可以使用不同的循环语句(for 或者 while)来实现这个题目。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int sum=0;
        for(int i=1;i<=n;i++){
            sum=sum+i;
        }
        System.out.println(sum);
    }
}

第三章:常用类

本章我们来介绍下一下 Java 常用类,包含如下:

  • String
  • Math
  • Scanner
  • Date
  • System
  • Random

3.1字符串

常用的 String 方法
1、char charAt(int index)

String str = "lintcode";
char ch = str.charAt(0);	// ch 的值为 l 

2、boolean equals(Object obj)

String str1 = "lintcode";
String str2 = "lintcode";
boolean rs = str1.equals(str2);		// rs 的值为 true

3、boolean startsWith(String prefix)

String str = "lintcode";
boolean rs = str.startsWith("lint");	 // rs 的值为 true

4、boolean endsWith(String suffix)

String str = "lintcode";
boolean rs = str.endsWith("code");	 // rs 的值为 true

5、int indexOf(String str)

String str = "lintcodecode";
int index = str.indexOf("co");		// index 的值为 4

此方法返回指定子字符串 str 第一次出现的索引。若 str 没有出现过,则返回值为 -1。

3.2截取下标为5的字符

任意输入一个长度大于 6 的字符串,然后截取下标为 5 的字符,将其输出。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		// write your code here
		Scanner sc = new Scanner(System.in);
		System.out.print(sc.next().charAt(5));
	}
}

3.3判断字符串是否相等

李四收到一项任务,要求他编写一道程序,用来判断输入的两个字符串是否相等,如果相等则返回 true,如果不相等则返回 false,请你帮助他完成这项任务。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		// write your code here
				Scanner sc = new Scanner(System.in);
		String str1 = sc.nextLine();
		String str2 = sc.nextLine();

		System.out.println(str1.equals(str2));
	}
}

3.4字符串(二)

1、int lastIndexOf(String str)

String str = "lintcodecode";
int index = str.lastIndexOf("co");		// index 的值为 8

2、String substring(int beginIndex, int endIndex)

String str = "lintcode";
String s = str.substring(0,4);		// s 的值为 lint

3、String concat(String str)

String str1 = "hello ";
String str2 = "lintcode";
String s = str1.concat(str2);		// s 的值为 hello lintcode

4、String replace(char oldChar, char newChar)

String str = "clintcodec";
String s = str.replace('c','a');	// s 的值为 alintaodea

5、String toUpperCase()

String str = "lintcode";
String s = str.toUpperCase();		// s 的值为 LINTCODE

6、String toLowerCase()

String str = "LINTCODE";
String s = str.toLowerCase();		// s 的值为 lintcode

7、String[] split(String regex)

String str = "a&b&c&d";
String arr[] = str.split("&");		// arr 的值为 ["a", "b", "c", "d"]

8、String trim()

String str = " lintcode ";
String s = str.trim();			// s 的值为 lintcode

从原始字符串中省略前导和尾随空格后返回子字符串。
9、int length()

String str = "lintcode";
int len = str.length();		// len 的值为 8

3.5字符串中的字母大小写转换

请编写代码,使用 String 类中的相关方法和 Character 类中的相关方法将字符串中所有的大写字母转换成小写字母,所有的小写字母转换成大写字母。

public class Solution {

    public String alphabetConversion(String str) {
        // write your code here
        char[] s =str.toCharArray();
        for(int i =0;i<s.length;i++){
            if(s[i] >='A' &&s[i]<='Z'){
                s[i]=Character.toLowerCase(s[i]);
            }
            else if(s[i] >='a' &&s[i]<='z'){
                s[i]=Character.toUpperCase(s[i]);
            }
        }
         String string = new String(s);
        return string;
    }
}

3.6其他方法

  • boolean equalsIgnoreCase(String string):它的工作原理与 equals 方法相同,但在比较字符串时不考虑大小写。它进行不区分大小写的比较。

  • int compareTo(String string):此方法根据字符串中每个字符的 Unicode 值比较两个字符串。

  • int compareToIgnoreCase(String string):与 CompareTo 方法相同,但它在比较过程中忽略大小写。

  • boolean startsWith(String prefix, int offset):它检查子字符串(从指定的偏移索引开始)是否具有指定的前缀。

  • int hashCode():它返回字符串的哈希码。

  • int indexOf(int ch):返回指定字符 ch 在字符串中第一次出现的索引。

  • int indexOf(int ch, int fromIndex):与 indexOf 方法相同,但它从指定的 fromIndex 开始在字符串中搜索。

  • int lastIndexOf(int ch):它返回字符串中最后一次出现的字符 ch。

  • int lastIndexOf(int ch, int fromIndex):与 lastIndexOf(int ch) 方法相同,它从 fromIndex 开始搜索。

  • String substring(int beginIndex):它返回字符串的子字符串。子字符串以指定索引处的字符开头。

  • boolean contains(CharSequence s):它检查字符串是否包含指定的字符值序列。如果是,则返回 true 否则返回 false。它抛出 NullPointerException of 's' is null。

  • String toUpperCase(Locale locale):使用指定语言环境定义的规则将字符串转换为大写字符串。

  • public String intern():该方法在内存池中搜索指定的字符串,如果找到则返回它的引用,否则它将内存空间分配给指定的字符串并为其分配引用。

  • public boolean isEmpty():如果给定字符串的长度为 0,则此方法返回 true。如果指定的 Java 字符串的长度不为零,则返回 false。

  • String[] split(String regex, int limit):它拆分字符串并返回与给定正则表达式匹配的子字符串数组。limit 是这里的结果阈值。

  • String toLowerCase(Locale locale):它使用给定语言环境定义的规则将字符串转换为小写字符串。

  • public static String format():这个方法返回一个格式化的 String。

  • static String copyValueOf(char[] data):它返回一个包含指定字符数组字符的字符串。

  • String copyValueOf(char[] data, int offset, int count):与上面的方法相同,但有两个额外的参数——子数组的初始偏移量和子数组的长度。

  • void getChars(int srcBegin, int srcEnd, char[] dest, int destBegin):将 src 数组的字符复制到 dest 数组。只有指定的范围被复制(srcBegin 到 srcEnd)到 dest 子数组(从 destBegin 开始)。

  • boolean contentEquals(StringBuffer sb):它将字符串与指定的字符串缓冲区进行比较。

  • boolean regionMatches(int srcoffset, String dest, int destoffset, int len):它将输入的子字符串与指定字符串的子字符串进行比较。

  • boolean regionMatches(boolean ignoreCase, int srcoffset, String dest, int destoffset, int len): regionMatches 方法的另一种变体,带有额外的布尔参数来指定比较是区分大小写还是不区分大小写。

  • byte[] getBytes(String charsetName):它使用指定的字符集编码将字符串转换为字节序列,并返回结果字节数组。

  • byte[] getBytes():此方法类似于上述方法,只是使用默认字符集编码将字符串转换为字节序列。

  • int codePointAt(int index):它类似于 charAt 方法,但它返回指定索引的 Unicode 代码点值而不是字符本身。

  • public static String join():此方法使用指定的分隔符连接给定的字符串并返回连接的 Java 字符串。

  • String replaceAll(String regex, String replacement):它将所有出现的符合正则表达式正则表达式的子字符串替换为替换字符串。

  • String replaceFirst(String regex, String replacement):它用指定的替换字符串替换第一个符合给定正则表达式 “regex” 的子字符串。

  • boolean matches(String regex):它检查字符串是否与指定的正则表达式 正则表达式匹配 。

  • static String valueOf():此方法返回传递参数的字符串表示形式,例如 int、long、float、double、char 和 char 数组。

  • char[] toCharArray():将字符串转换为字符数组。

3.7字符串字符排序

在类 Solution 中,含有名为 handle 的方法,要求传入任意非空的字符串,需要你对其中的字符按字典顺序排序,最终返回一个新的字符串。


import java.util.Arrays;

public class Solution {
  
    public String handle(String str) {
        char[] chars = str.toCharArray();
        Arrays.sort(chars);
        // 将数组转化成字符串
        return String.valueOf(chars);
    }
}

3.8拼接字符串并改为大写

本题无需任何输入,你需要运用 Java 中字符串的知识,将已经定义好的两个字符串 str1 和 str2 拼接在一起,并将拼接好的字符串全部转为大写,输出最后的结果。

public class Main {
	public static void main(String[] args) {
        String str1 = "I love ";
		String str2 = "China";
		// write your code here
		str1 = str1.concat(str2);
		str1 = str1.toUpperCase();
		System.out.println(str1);
	}
}

3.9Math 类

1、静态常量

System.out.println("E 常量的值:" + Math.E);		// E 常量的值:2.718281828459045
System.out.println("PI 常量的值:" + Math.PI);	// PI 常量的值:3.141592653589793

2、求最大值、最小值和绝对值

System.out.println("10 和 20 的较大值:" + Math.max(10, 20));		// 10和20的较大值:20
System.out.println("15.6 和 15 的较小值:" + Math.min(15.6, 15));	// 15.6和15的较小值:15.0
System.out.println("-12 的绝对值:" + Math.abs(-12));			 // -12的绝对值:12

3、求整运算

方法 描述
Math.ceil() 返回大于等于( >= )给定参数的的最小整数,类型为双精度浮点型。
Math.floor() 返回小于等于(<=)给定参数的最大整数 。
Math.rint() 返回与参数最接近的整数,返回类型为double。
Math.round() 它表示四舍五入,算法为 Math.floor(x+0.5),即将原来的数字加上 0.5 后再向下取整,
double num = 99.01;
System.out.println("大于或等于 "+ num +" 的最小整数:" + Math.ceil(num));
System.out.println("小于或等于 "+ num +" 的最大整数:" + Math.floor(num));
System.out.println("将 "+ num +" 加上 0.5 之后最接近的整数:" + Math.round(num+0.5));
System.out.println("最接近 "+ num +" 的整数:" + Math.rint(num));

上述代码的结果为:

大于或等于 99.01 的最小整数:100.0
小于或等于 99.01 的最大整数:99.0
将 99.01 加上 0.5 之后最接近的整数:100
最接近 99.01 的整数:99.0
4、三角函数运算

方法 描述
Math.sin() 它用于返回给定双精度值的三角正弦值。
Math.cos() 它用于返回给定双精度值的三角余弦值。
Math.tan() 它用于返回给定双精度值的三角正切值。
Math.asin() 它用于返回给定双精度值的三角反正弦值
Math.acos() 它用于返回给定双精度值的三角反余弦值。
Math.atan() 它用于返回给定双精度值的三角反正切值。
Math.toRadians() 它用于将指定的度角转换为以弧度为单位测量的等效角度。
5、指数运算
方法 描述
--- ---
Math.exp()
Math.pow() 返回第一个参数的第二个参数次方。
Math.sqrt() 求参数的算术平方根。
Math.cbrt() 返回任意数字的立方根.
Math.log() 返回参数的自然数底数的对数值。

3.10求直角坐标系内两点间距离

请从标准输入流(控制台)中获取 4 个正整数 x1,y1,x2,y2 表示两个点的坐标 (x1, y1),(x2, y2), 要求计算出这两个点之间的距离(保留两位小数),并且你需要使用 System.out.printf 语句输出该距离。


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x1 = sc.nextInt();
        int y1 = sc.nextInt();
        int x2 = sc.nextInt();
        int y2 = sc.nextInt();
        double distance = Math.sqrt(((x1 - x2) * (x1 - x2)) +
                ((y1 - y2) * (y1 - y2)));
        System.out.printf("%.2f\n", distance);
    }
}

3.11圆型周长

给出圆形的半径 r,请计算圆型的周长并将计算结果保留两位有效数字通过 System.out.printf 语句输出。

public class Main {
    public static void main(String[] args) {
        int r = Integer.parseInt(args[0]);
        System.out.printf("%.2f",2*Math.PI*r);      
    }
}

3.12Scanner 类

1、next 方法

Scanner scan = new Scanner(System.in);
// 从键盘接收数据

// next方式接收字符串
System.out.println("next方式接收:");
// 判断是否还有输入
if (scan.hasNext()) {
    String str1 = scan.next();
    System.out.println("输入的数据为:" + str1);
}
scan.close();

// 输出结果为:
next方式接收:
lintcode com
输入的数据为:lintcode
2、nextLine 方法

 Scanner scan = new Scanner(System.in);
// 从键盘接收数据

// nextLine方式接收字符串
System.out.println("nextLine方式接收:");
// 判断是否还有输入
if (scan.hasNextLine()) {
    String str2 = scan.nextLine();
    System.out.println("输入的数据为:" + str2);
}
scan.close();

// 输出结果为:
next方式接收:
lintcode com
输入的数据为:lintcode com
3、next() 与 nextLine() 区别
next():

  • 1、一定要读取到有效字符后才可以结束输入。
  • 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • 4、next() 不能得到带有空格的字符串。
    nextLine():
  • 1、以 Enter 为结束符,也就是说 nextLine() 方法返回的是输入回车之前的所有字符。
  • 2、可以获得空白。
    1.4、hasNextLine
  • 我们可以使用 hasNextLine() 方法去不断地从控制台读取数据。

5、其他方法

方法 描述
next() 查找并返回来自次扫描器的下一个完整标记。
nextBigDecimal() 将输入信息的下一个标记扫描为一个 BigDecimal。
nextBigInteger() 将输入信息的下一个标记扫描为一个 BigInteger。
nextBoolean() 扫描解释为一个布尔值的输入标记并返回该值。
nextByte() 将输入信息的下一个标记扫描为一个 byte。
nextDoule() 将输入信息的下一个标记扫描为一个 double。
nextFloat() 将输入信息的下一个标记扫描为一个 float。
nextInt() 将输入信息的下一个标记扫描为一个 int。
nextLine() 此扫描器执行当前行,并返回跳过的输入信息。
nextLong() 将输入信息的下一个标记扫描为一个 long。
nextShort() 将输入信息的下一个标记扫描为一个 short。

3.13字符的ASCII码

本题将通过控制台输入获取一个字符,并赋值于 character,请通过 System.out.println 语句输出 character 的 ASCII 码。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        // write your code here
        Scanner myscanner = new Scanner(System.in);// 通过 `Scanner` 类获取控制台输入流
        Character character = myscanner.next().charAt(0);//得到输入字符串的第一个字符
        int ascii = character;//得到字符的ASCII码
        System.out.println(ascii);//输出ASCII码
        
    }
}

3.14System 类

1、currentTimeMillis 方法

System.out.println("当前时间句距离 1970年01月01日00:00 之间差的毫秒值为:"+System.currentTimeMillis());

2、getProperty 和 getProperties 方法

// 获取系统的所有属性
System.out.println(System.getProperties());

// 获取系统指定的属性
System.out.println(System.getProperty("java.version"));

3、arrayCopy 方法
arrayCopy() 用来实现将源数组部分元素复制到目标数组的指定位置。

使用方法:System.arrayCopy(Object srcArray,int srcPos,Object destArray ,int destPos,int length)。

字段解释:

  • Object srcArray 原数组(要拷贝的数组)。
  • int srcPos 要复制的原数组的起始位置(数组从 0 位置开始)。
  • Object destArray 目标数组。
  • int destPos 目标数组的起始位置。
  • int length 原数组的长度。
    下面的代码,将数组 arr2 中的数据,放到了数组 arr1 的尾部,替换了 1,2,3:
int[] arr1 ={5,6,7,0,6,6,1,2,3};
int[] arr2 ={12,14,67};
System.arraycopy(arr2, 0 , arr1, 6 , 3);
System.out.print("复制后数组arr1的值为:");
for (Integer a : arr1){
    System.out.print(a+"  ");
}

4、其他方法

方法 描述
clearProperty() 移除指定键指示的系统属性。
console() 返回与当前 Java 虚拟机关联的唯一 Console 对象(如果有)。
exit() 终止当前正在运行的 Java 虚拟机。
gc() 运行垃圾回收器。
getenv() 返回一个不能修改的当前系统环境的字符串映射视图。
getSecurityManager() 获取系统安全接口。
identityHashCode() 返回给定对象的哈希码,该代码与默认的方法 hashCode()
inheritedChannel() 返回从创建此 Java 虚拟机的实体中继承的信道。
load() 从作为动态库的本地文件系统中以指定的文件名加载代码文件。

3.15复制指定元素

你需要将数组 arr 中的前五位元素复制到一个新的数组中,并将新数组打印到标准输出流(控制台)中。

public class Main {
	public static void main(String[] args) {
        int[] arr={1,2,3,4,5,6,7,8,9};
		int [] newArr = new int[5];
		for(int i=0;i<5;i++){
			newArr[i] = arr[i];
			System.out.print(newArr[i]+" ");
		}
	}
}

3.16随机生成数字

你的代码需要从标准输入流(控制台)读入一个正整数 n,并将正整数 n 作为随机种子,根据这个 int 类型的变量 n 的值来获取 50 个随机数字,范围是 [1,n]。将获取到的 50 个随机数打印到标准输出流(控制台)中。

import java.util.Random;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		// write your code here
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		Random r = new Random(n);
		for(int i = 0;i<50;i++){
			//随机数生成范围是从[0,n)
			System.out.println(r.nextInt(n)+1);
		}
	}
}

3.17日期格式转换

给定一个字符串日期,日期的格式为 yyyy-MM-dd 请你将它转换为 yyyy年MM月dd日 的格式。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Solution {

    public String dateConversion(String str) throws ParseException {
-
        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(str);
        return new SimpleDateFormat("yyyy年M月d日").format(date);
    }
}

第四章:正则

正则表达式菜鸟程序员学习链接

4.1简单的手机号码验证

我们现在做一个简单的正则表达式的练习,我们知道手机号码的首位数字是 1,第二位数字在 3 ~ 9 之间,由于做的简单匹配,其余数字不做要求。isMatch() 会传入一个手机号码,请写一个简单的手机号匹配并将匹配结果返回。

import java.util.regex.*;
public class Solution {
    public static boolean isMatch(String s) {
        Pattern p = Pattern.compile("^1[3-9]{1}[0-9]{9}+$");
        Matcher m = p.matcher(s);
        return m.matches();
    }
}

4.2简单校验一下邮箱格式

请用正则表达式(当然你不用也是可以的)对邮箱格式进行简单的校验,并将校验结果返回。

  • 邮箱首位是除数字以外的字母或下划线
  • 邮箱必须含有 @ 和 .com 字符
  • 邮箱可以存在多级域名
  • 邮箱名称部分也存在多级
public class Solution {
    public static boolean isMatch(String s) {
        // write your code here
        return s.matches("[a-zA-Z_]{1}[0-9a-zA-Z\\.]*@([0-9a-zA-Z]+\\.)+(com)+(\\.[\\.a-zA-Z0-9]+)*");
                        //首字母        之后到@前           字母+.         com     .后缀       有·必有字母     可以多个或没有
    }

}

4.3简单的字符串匹配替换

给出一段字符串,在该字符串中存在着奇怪的字符,不方便阅读。现在要求你将其中的奇怪字符替换为空格,你只需在 Solution 类中写 replaceString 方法,将替换后的字符串返回即可。

public class Solution {
    public static String replaceString (String str, String replacement) {
        // write your code here
        return str.replaceAll("[\\]/\\|~!@#$%\\^&\\*\\(\\);:_\\+\\-\\[\\]]+", replacement);
    }
}