day13 java基础API与常用算法_Exercises

字符串专项扩展题

第1题:反转键盘录入的字符串。

参考效果如图所示:

image-20220124084716264

package com.atguigu.test01;

import java.util.Scanner;

public class Test01 {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.print("请键盘输入字符串:");
		String str = input.next();
		
		StringBuilder s = new StringBuilder(str);
		str = s.reverse().toString();
		System.out.println("反转后:" + str);
		input.close();
	}
}

第2题:验证qq号码

  • 键盘录入QQ号码,验证格式的正确性。

    • 必须是5—12位数字。
    • 0不能开头。
  • 效果如图所示:

    image-20220124085036154

image-20220124085054255

package com.atguigu.homework2;

import java.util.Scanner;

public class Homework2 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("请输入qq号码:");
        String qq = input.next();

        System.out.print("这个qq号是否正确:");
        if(qq.matches("[1-9][0-9]{4,11}+")){
            System.out.println(true);
        }else{
            System.out.println(false);
        }
        input.close();
    }
}

第3题:替换某字符串中的某些字符。

  • 键盘录入一个源字符串存储在srcStr变量中,再录入要删除的字符串存储在delStr变量中。
  • 删除该字srcStr符串中的所有delStr字符串。
  • 并且统计delStr字符串在srcStr中出现的次数

效果如图所示:

1559729633062

package com.atguigu.homework3;

import java.util.Scanner;

public class Homework3 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.print("请输入原字符串:");
        String src = input.next();

        System.out.print("请输入要删除的字符串:");
        String del = input.next();

        String result = src.replaceAll(del, "");

        int count = (src.length() - result.length())/del.length();
        System.out.println(del+"共出现了:" + count + "次");
        System.out.println("删除" + del + "后字符串:" + result);

        input.close();
    }
}

第4题:筛选字符串

定义数组,存入多个字符串。删除长度大于5的字符串,打印删除后的数组。

效果如图所示:

image-20220124090411928

package com.atguigu.homework4;

import java.util.Arrays;

public class Homework4 {
    public static void main(String[] args) {
        String[] arr = {"helloworld","java","chai","atguigu","lin","yan","I love you"};

        System.out.println("原字符串:");
        System.out.println( Arrays.toString(arr));
        int index = 0;
        int length = arr.length;
        while(index < length){
            if(arr[index].length()>5){
                System.arraycopy(arr, index+1, arr, index, length-index-1);
                length--;
            }else{
                index++;
            }
        }
        System.out.println("删除后:");
        arr = Arrays.copyOf(arr, length);
        System.out.println(Arrays.toString(arr));
    }
}

第5题:判断回文字符串

如果一个字符串,从前向后读和从后向前读,都是一个字符串,称为回文串,比如mom,dad,noon。

package com.atguigu.homework5;

import org.junit.Test;

public class Homework5 {
    @Test
    public void test01() {
        String str = "noon";
        StringBuilder s = new StringBuilder(str);
        String string = s.reverse().toString();
        if(str.equals(string)){
            System.out.print(str + "是回文数");
        }else{
            System.out.print(str + "不是回文数");
        }
    }

    @Test
    public void test02() {
        String str = "noon";
        char[] arr = str.toCharArray();
        boolean flag = true;
        for (int left = 0,right=arr.length-1; left <=right; left++,right--) {
            if(arr[left] != arr[right]){
                flag = false;
                break;
            }
        }
        if(flag){
            System.out.print(str + "是回文数");
        }else{
            System.out.print(str + "不是回文数");
        }
    }
}

第6题:字符排序

案例:有一个字符串String abc = “342567891”,请写程序将字符串abc进行升序,可以使用JDK API中的现有的功能方法。

package com.atguigu.homework6;

import java.util.Arrays;

public class Homework6 {
    public static void main(String[] args) {
        String abc = "342567891";
        char[] arr = abc.toCharArray();
        Arrays.sort(arr);
        abc = new String(arr);
        System.out.println(abc);
    }
}

第7题:统计字母出现个数情况

1个字符串中可能包含a-z中的多个字符,字符也可能重复,例如:String data = “aabcexmkduyruieiopxzkkkkasdfjxjdsds”;写一个程序,对于给定一个这样的字符串求出字符串出现次数最多的那个字母以及出现的次数(若次数最多的字母有多个,则全部求出)

1574169374414

package com.atguigu.homework7;

public class Homework7 {
    public static void main(String[] args) {
        String str = "aabbyolhljlhlxxmnbwyteuhfhjloiqqbhrg";

        //统计每个字母的次数
        int[] counts = new int[26];
        char[] letters = str.toCharArray();
        for (int i = 0; i < letters.length; i++) {
            counts[letters[i]-97]++;
        }

        //找出最多次数值
        int max = counts[0];
        for (int i = 1; i < counts.length; i++) {
            if(max < counts[i]) {
                max = counts[i];
            }
        }
        //找出所有最多次数字母
        for (int i = 0; i < counts.length; i++) {
            if(counts[i] == max) {
                System.out.println((char)(i+97));
            }
        }
    }
}

第8题:拆分

案例:已知一个字符串内容如下,要求拆分出每一个单词,并遍历显示

String str = "1.hello2.world3.java4.string";
package com.atguigu.homework8;

public class Homework8 {
    public static void main(String[] args) {
        String str = "1.hello2.world3.java4.string";
        //把开头的1.去掉
        str = str.replaceAll("^\\d\\.","");
        //按照数字.的格式进行拆分
        String[] split = str.split("\\d\\.");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }
    }
}

拔高题

第9题:统计字母次数

已知一个字符串内容如下,要求统计出现次数最多的字母及其出现的次数。不区分大小写。

String str = "1、 hellao 2. world 3. java 4.String 5. haha 6、HELLO";
package com.atguigu.homework9;

public class Homework9 {
    public static void main(String[] args) {
        String str = "1、 hellao 2. world 3. java 4.String 5. haha 6、HELLO";

        //把字符串转为小写,因为不区分大小写,方便统计
        str = str.toLowerCase();
        //把里面的非字母去掉
        str = str.replaceAll("[^a-z]","");
        //转为字符数组
        char[] arr = str.toCharArray();
        //统计每个字母出现次数
        int[] counts = new int[26];//记录26个字母的次数
        /*
        counts[0]存'a'的次数   'a'=97  97-97->0
        counts[1]存'b'的次数   'b'=98  98-97->1
        */
        for (int i = 0; i < arr.length; i++) {
            counts[arr[i]-97]++;
        }

        //找最大值
        int max = counts[0];
        for (int i = 1; i < counts.length; i++) {
            if(max < counts[i]){
                max = counts[i];
            }
        }
        //打印最大值和字母
        for (int i = 0; i < counts.length; i++) {
            if(counts[i] == max){
                //i=0   'a'字母
                //i=1   'b'字母
                System.out.println(((char)(i+97)) + "出现了" + max + "次");
            }
        }
    }
}

第10题:统计子串出现次数

获取一个字符串在另一个字符串中出现的次数。比如:获取"ab"在 “abababkkcadkabkebfkabkskab”中出现的次数

package com.atguigu.homework10;

public class Homework10 {
    public static void main(String[] args) {
        String str1="ab";
        String str2="abababkkcadkabkebfkabkskab";
        System.out.println(str1 + "在" + str2 +"中出现的次数:" + count(str1,str2));
    }

    public static int count(String str1,String str2){
        int count =0;
        while(true){
            int index = str2.indexOf(str1);
            if(index != -1){
                count++;
                str2 = str2.substring(index + str1.length());
            }else{
                break;
            }

        }
        return count;
    }
}

第11题:字符串替换

编写代码完成如下功能

public static String replace(String text, String target, String replace){

....

}

示例:replace(“aabbccbb”, “bb”, “dd”);  结果:aaddccdd

注意:不能使用StringStringBuffer等类的replace等现成的替换API方法。
package com.atguigu.homework11;

public class Homework11 {
    public static void main(String[] args) {
        System.out.println(replace("aabbcbcbb", "bb", "dd"));
    }

    public static String replace(String text, String target, String replace) {
        while (true) {
            int index = text.indexOf(target);
            if (index != -1) {
                text = text.substring(0, index) + replace + text.substring(index + target.length());
            } else {
                break;
            }
        }
        return text;
    }
}

第12题:模拟用户登录

(1)定义用户类,属性为用户名和密码。

(2)使用数组存储多个用户对象。

(3)录入用户和密码,对比用户信息,匹配成功登录成功,否则登录失败。

  • 登录失败时,当用户名错误,提示没有该用户。
  • 登录失败时,当密码错误时,提示密码有误。

效果如图所示:

image-20220124092056137

image-20220124092115580

package com.atguigu.homework12;

public class User {
    private String username;
    private String password;
    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return username + "-" + password;
    }
}
package com.atguigu.homework12;

import java.util.Scanner;

public class Homework12 {
    public static void main(String[] args) {
        User[] all = new User[3];
        all[0] = new User("atguigu","123");
        all[1] = new User("chailinyan","8888");
        all[2] = new User("java","6666");
        System.out.println("库中的用户有:");
        for (int i = 0; i < all.length; i++) {
            System.out.println(all[i]);
        }

        Scanner input =new Scanner(System.in);
        System.out.print("请输入用户名:");
        String username = input.next();
        System.out.print("请输入密码:");
        String password = input.next();

        boolean flag = false;
        for (int i = 0; i < all.length; i++) {
            if(all[i].getUsername().equals(username) && all[i].getPassword().equals(password)){
                flag = true;
                break;
            }
        }
        System.out.println("登录结果:" +flag);
        input.close();
    }
}

第13题:数字格式化

(1)定义Handleable接口,具备一个处理字符串数字的抽象方法方法String handleString(String num);

(2)从键盘输入一个double类型的小数,用匿名内部类实现上面的接口,分别把小数处理为

  • 处理方式1:取整数部分。
  • 处理方式2:保留小数点后2位,不考虑四舍五入
  • 处理方式3:保留指定位小数,考虑四舍五入。
package com.atguigu.test10;

public interface Handleable {
	String handleString(String num);
}

package com.atguigu.homework13;

import java.math.BigDecimal;

public class Homework13 {
    public static void main(String[] args) {
        String str = "23.23656789";
        System.out.println("原数字:" + str);
		String result1 = new Handleable() {
			@Override
			public String handleString(String num) {
				//查找小数点.位置
				int index = num.indexOf(".");
				if(index != -1){
					num = num.substring(0, num.indexOf("."));
				}
				return num;
			}
		}.handleString(str);
        System.out.println("取整后:" + result1);

        String result2 = new Handleable() {
            @Override
            public String handleString(String num) {
                //查找小数点.位置
                int index = num.indexOf(".");
                if(index != -1){
                    num = num.substring(0, num.indexOf(".")+3);
                }
                return num;
            }
        }.handleString(str);
        System.out.println("保留小数点后2位,不考虑四舍五入:" + result2);

        final int wei = 4;//截取到小数点后4位,四舍五入
        String result3 = new Handleable() {
            @Override
            public String handleString(String num) {
                BigDecimal big = new BigDecimal(num);
                BigDecimal b = new BigDecimal("1");
                BigDecimal shang = big.divide(b, wei, BigDecimal.ROUND_HALF_UP);
                return shang.toString();
            }
        }.handleString(str);
        System.out.println("保留小数点后" + wei +"位,考虑四舍五入:" + result3);
    }
}

第14题:获取两个字符串中最大相同子串

获取两个字符串中最大相同子串。

比如:str1 = “abcwerthelloyuiodef“; str2 = “cvhellobnm”,最大相同子串是"hello”。

提示:将短的那个串进行长度依次递减的子串与较长的串比较。

package com.atguigu.homework14;

public class Homework14 {
    public static void main(String[] args) {
        String str=findMaxSubString("abcwerthelloyuiodef","cvhellobnm");
        System.out.println(str);
    }

    //提示:将短的那个串进行长度依次递减的子串与较长的串比较。
    public static String findMaxSubString(String str1,String str2){
        String result="";

        String mixStr = str1.length()<str2.length()?str1:str2;
        String maxStr = str1.length()>str2.length()?str1:str2;

        //外循环控制从左到右的下标,内循环控制从右到左的下标
        for(int i=0;i<mixStr.length();i++){
            for(int j=mixStr.length();j>=i;j--){
                String str=mixStr.substring(i, j);
                if(maxStr.contains(str)){
                    //找出最大相同子串
                    if(result.length()<str.length()){
                        result = str;
                    }
                }
            }
        }
        return result;
    }
}

第15题:重叠月份

假设日期段用两个6位长度的正整数表示,例如:(201401,201406)用来表示2014年1月到2014年6月,求两个日期段的重叠月份数。例如:输入:时间段1:201401和201406,时间段2:201403和201409,输出:4

解释:重叠月份:3,4,5,6月共4个月

情形1:两个时间段都是同一年内的,实现代码如下:

	public static void main(String[] args) {
		String date1Start = "201401";
		String date1End = "201406";
		
		String date2Start = "201403";
		String date2End = "201409";
		
		int date1StartMonth = Integer.parseInt(date1Start.substring(4));
		int date1EndMonth = Integer.parseInt(date1End.substring(4));
		
		int date2StartMonth = Integer.parseInt(date2Start.substring(4));
		int date2EndMonth = Integer.parseInt(date2End.substring(4));
		
		int start = date1StartMonth >= date2StartMonth ? date1StartMonth : date2StartMonth;
		int end = date1EndMonth <= date2EndMonth ? date1EndMonth : date2EndMonth;
        System.out.println("重叠月份数:"+(end-start+1));
        
		System.out.println("重叠的月份有:");
		for (int i = start; i <= end; i++) {
			System.out.println(i);
		}        
	}

情形2:两个时间段可能不在同一年内的,实现代码如下:

	public static void main(String[] args) {
		String date1Start = "201401";
		String date1End = "201506";
		
		String date2Start = "201403";
		String date2End = "201505";
		
		String date1 = handleDate(date1Start,date1End);
		String date2 = handleDate(date2Start,date2End);
		System.out.println(date1);
		System.out.println(date2);
		
		String sameDate = findMaxSubString(date1,date2);

		System.out.println("重叠的月份数:" + sameDate.length()/6);
		if (!"".equals(sameDate)) {
			System.out.println("重叠的月份有:");
			while (sameDate.length() > 0) {
				String sameMonth = sameDate.substring(0, 6);
				System.out.println(sameMonth);
				sameDate = sameDate.substring(6);
			}
			
		}
	}
	public static String handleDate(String dateStart, String dateEnd) {
		int dateStartYear = Integer.parseInt(dateStart.substring(0,4));
		int dateEndYear = Integer.parseInt(dateEnd.substring(0,4));
		int dateStartMonth = Integer.parseInt(dateStart.substring(4));
		int dateEndMonth = Integer.parseInt(dateEnd.substring(4));
		
		String date = "";
		if(dateStartYear == dateEndYear) {//一年之内
			for (int i = dateStartMonth; i <=dateEndMonth; i++) {
				if(i<10) {
					date += dateStartYear+"0"+i;
				}else {
					date += dateStartYear+""+i;
				}
			}
		}else {//跨年
			for (int i = dateStartMonth; i <=12; i++) {//date1StartYear起始年
				if(i<10) {
					date += dateStartYear+"0"+i;
				}else {
					date += dateStartYear+""+i;
				}
			}
			for (int i = dateStartYear+1; i < dateEndYear; i++) {//中间间隔年
				for (int j = 1; j <= 12; j++) {
					if(j<10) {
						date += i+"0"+j;
					}else {
						date += i+""+j;
					}
				}
			}
			for (int i = 1; i <= dateEndMonth; i++) {//date1EndYear结束年
				if(i<10) {
					date += dateEndYear+"0"+i;
				}else {
					date += dateEndYear+""+i;
				}
			}
		}
		return date;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值