文章目录
- 1.第一题
- 1.1题目
- 1.2思路
- 1.3解题
- 2.第二题
- 2.1题目
- 2.2思路
- 2.3解题
1.第一题
1.1题目
描述:
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。
输入描述:
输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
1.2思路
- 喝到的汽水数=空瓶子的数/3
- 空瓶子的数=空瓶子的数/3+空瓶子的数%3
- 如果剩下两个空瓶子可以向老板借一瓶汽水,记得把喝到的汽水数加一
1.3解题
import java.util.*;
public class Main {public static int getSum(int num){int sum = 0;while(num > 1){//喝到的汽水的数量sum += num / 3;//空瓶子的数量num = num /3 + num % 3;//如果剩下两个空瓶子可以向老板借一瓶汽水if(num == 2){sum++;break;}}return sum;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int num;//这里是因为最后一个输入0表示结束,不用输出结果while((num = sc.nextInt()) != 0){System.out.println(getSum(num));}}
}
2.第二题
2.1题目
描述:
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开
输入描述:
输入两个字符串
输出描述:
返回重复出现的字符
2.2思路
- 将字符串转化为字符串数组
- 定义一个二维数组统计当前最长字符串的长度
- 如果第i个字符和第j个字符相等,就进行累加
- 如果会面出现了更长的子串记得更新最长子串的长度以及最长子串起始的位置
- 记得根据输入的两个字符串的长度判断输出结果
2.3解题
import java.util.*;
import java.io.*;
public class Main {public static String getMaxStr(String str1, String str2) {char[] ch1 = str1.toCharArray();char[] ch2 = str2.toCharArray();//多增加一行一列,作为辅助状态int[][] arr = new int[ch1.length + 1][ch2.length + 1];int sumLen = 0;//最长公共子串的长度int start = 0;//最长公共子串的起始位置//状态:以str1的第i个字符结尾和以str2的第j个字符结尾的最长公共子串的长度for (int i = 1; i <= ch1.length; i++) {for (int j = 1; j <= ch2.length; j++) {//如果第i个字符和第j个字符相等,则进行累加if (ch1[i - 1] == ch2[j - 1]) {arr[i][j] = arr[i - 1][j - 1] + 1;if (sumLen < arr[i][j]) {sumLen = arr[i][j];start = i - sumLen;}}}}return str1.substring(start, start + sumLen);}public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str1 = sc.nextLine();String str2 = sc.nextLine();if (str1.length() < str2.length()) {System.out.println(getMaxStr(str1, str2));} else {System.out.println(getMaxStr(str2, str1));}}
}