目录
- 第一章、HJ1计算字符串最后一个单词的长度,单词以空格隔开。
- 1.1)描述
- 1.2)解题
- 第二章、算法题HJ2 计算某字符出现次数
- 1.1)题目描述
- 1.2)解题思路与答案
- 第三章、算法题HJ3 明明的随机数
- 1.1)题目描述
- 1.2)解题思路与答案
- 第四章、算法题HJ4 字符串分隔
- 1.1)题目描述
- 1.2)解题思路与答案
- 第五章、算法题HJ5 进制转换
- 1.1)题目描述
- 1.2)解题思路与答案
- 1.3)派仔的解题思路与答案
- 第六章、算法题HJ6 质数因子
- 1.1)题目描述
- 1.2)文的盲的解题思路与答案
- 第七章、算法题HJ7 取近似值
- 1.1)题目描述
- 1.2)第一种解题思路与答案
- 1.3)第二种解题思路与答案
- 第八章、算法题HJ8 合并表记录
- 1.1)题目描述
- 1.2)解题思路与答案
第一章、HJ1计算字符串最后一个单词的长度,单词以空格隔开。
1.1)描述
描述
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度。
1.2)解题
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String st = sc.nextLine();
String[] s = st.split("\\s+") ;//或者st.split(" ");
int length = s[s.length - 1].length();
System.out.println(length);
}
}
第二章、算法题HJ2 计算某字符出现次数
1.1)题目描述
题目描述:
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字符,然后输出输入字符串中该字符的出现次数。(不区分大小写字母)
输入描述:
第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)。
输出描述:
输出输入字符串中含有该字符的个数。(不区分大小写字母)
示例:
1.2)解题思路与答案
解题思路:
①查看示例是不关心大小写的,所以需要将大写转为小写
②将s1需要查找的字符串(即s2)全部替换为 “”
③将原来的字符串长度-替换过后的字符串长度=出现的次数
答案:
public static void main(String[] args){
Scanner input = new Scanner(System.in);
// 输入第一个字符串并且全部转小写
String s1 = input.nextLine().toLowerCase();
// 输入单个字符串并且转小写
String s2 = input.nextLine().toLowerCase();
// 完整字符的长度-单个字符长度 = 出现的次数
int num = s1.length() - s1.replaceAll(s2,"").length();
System.out.println(num);
}
第三章、算法题HJ3 明明的随机数
1.1)题目描述
题目描述:
明明生成了NN个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。
数据范围: 1 \le n \le 1000 \1≤n≤1000 ,输入的数字大小满足 1 \leval \le 500 \1≤val≤500
输入描述:
第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数,代表明明生成的随机数。 具体格式可以参考下面的"示例"。
输出描述:
输出多行,表示输入数据处理后的结果
示例:
1.2)解题思路与答案
解题思路:
①将数据存入TreeSet集合进行去重+排序
②遍历输出数据
答案:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//获取总个数
int num = sc.nextInt();
//创建TreeSet进行去重排序
TreeSet se = new TreeSet();
//输入num个数据
for(int i =0 ; i < num ;i++){
se.add(sc.nextInt());
}
Iterator iterator = se.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
第四章、算法题HJ4 字符串分隔
1.1)题目描述
题目描述:
描述
•输入一个字符串,请按长度为8拆分每个输入字符串并进行输出;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(每个字符串长度小于等于100)
输出描述:
依次输出所有分割后的长度为8的新字符串
示例:
1.2)解题思路与答案
Luo_xguan的解题思路:
1.获取输入的字符串
2.判断字符串长度,小于8,在后面补上0,达到8位,大于8,先以8位作为
一段截取,再判断剩余字符串长度与8比较,如果小于8,照上述操作,大于8,先截取8位,再判断剩下的…如此循环操作。
答案:
import java.util.Scanner;
/**
* @author lxg
* @description 字符串分割
* @date 2021/9/26
*/
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNextLine()){
String s = input.nextLine();
split(s);
}
}
public static void split(String s){
while(s.length()>=8){
System.out.println(s.substring(0,8));
s=s.substring(8);
}
if(s.length()<8 && s.length()>0){
s+="00000000";
System.out.println(s.substring(0,8));
}
}
}
第五章、算法题HJ5 进制转换
1.1)题目描述
题目描述:
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
示例:
1.2)解题思路与答案
解题思路:
①使用Java自带的Integer.parseInt(String,16) 方法
答案:
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
while(sc.hasNextLine()){
String s = sc.nextLine();
System.out.println(Integer.parseInt(s.substring(2,s.length()),16));
}
}
}
1.3)派仔的解题思路与答案
①res = res * BASE + map.get(ch); 这个公式是精华原理如图:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Putest {
private final static int BASE = 16;
private static Map<Character, Integer> map = new HashMap<Character, Integer>()
{{
put('0', 0);
put('1', 1);
put('2', 2);
put('3', 3);
put('4', 4);
put('5', 5);
put('6', 6);
put('7', 7);
put('8', 8);
put('9', 9);
put('A', 10);
put('B', 11);
put('C', 12);
put('D', 13);
put('E', 14);
put('F', 15);
put('a', 10);
put('b', 11);
put('c', 12);
put('d', 13);
put('e', 14);
put('f', 15);
}};
public static int getDecimal(String number) {
int res = 0;
char [] arr =number.toCharArray();
for( int i=0;i<arr .length;++i){
//这个公式是精华,map.get()方法返回指定键所映射的值
res = res * BASE + map.get(arr[i]);
}
/* 也可以这样写循环
for (char ch : number.toCharArray()) {
//这个公式是精华,map.get()方法返回指定键所映射的值
res = res * BASE + map.get(ch);
}*/
return res;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNext()) {
String number = in.next();
int res = getDecimal(number.substring(2));
System.out.println(res);
}
}
}
第六章、算法题HJ6 质数因子
1.1)题目描述
题目描述:
功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )
输入描述:
输入一个整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
示例:
1.2)文的盲的解题思路与答案
解题思路:
①试除法是一种简单有效的方法,可以快速找到给定数的质因数。首先,从最小的质数2开始,不断用给定数去除,如果能整除,则找到一个质因数,并将其记录下来。然后将商作为新的数,继续用质数去除,直到商变为1为止。这样就可以找到给定数的所有质因数。
②因为一个正整数最多有一个质因子大于其平方根,且只会是其本身所以我们判断数 num 是不是质数时,没必要从 2 一直尝试到 num 一样,此题中的大循环也大可不必写一个到 num 的循环,写到 根号num即可,如果此时数字还没有除数,则可判定其本身是一个质数,没有再除下去的必要了,直接打印其本身即可:
答案:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long num = scanner.nextLong();
long k = (long) Math.sqrt(num);
for (long i = 2; i <= k; ++i) {
while (num % i == 0) {
System.out.print(i + " ");
num /= i;
}
}
System.out.println(num == 1 ? "": num+" ");
}
第七章、算法题HJ7 取近似值
1.1)题目描述
题目描述:
写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于 0.5 ,向上取整;小于 0.5 ,则向下取整。
数据范围:保证输入的数字在 32 位浮点数范围内
输入描述:
输入一个正浮点数值
输出描述:
输出该数值的近似整数值
示例:
1.2)第一种解题思路与答案
派仔的解题思路:
①浮点数强转int时,直接舍掉小数,只留下整数。
答案:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
double number = in.nextDouble();
System.out.println((int)(number + 0.5));
}
}
1.3)第二种解题思路与答案
解题思路:
①Java中的Math.round()方法是将浮点型进行“四舍五入”转换为int类型的一个方法
答案:
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Double d = sc.nextDouble();
System.out.println((int)Math.round(d));
}
}
第八章、算法题HJ8 合并表记录
1.1)题目描述
题目描述:
数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例:
1.2)解题思路与答案
fuxiaoxian的解题思路:
①使用map, 然后要自动排序,就可是使用treeMap
②用map自带的getOrDefault方法,如果根据key没有值,就用默认的0表示方法的值,如果能根据key找到对应的值,那么直接赋值
答案:
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
TreeMap<Integer,Integer> map = new TreeMap<>();
while(sc.hasNext()){
int n = sc.nextInt();
for(int i =0;i<n;i++){
int key = sc.nextInt();
int value = sc.nextInt();
map.put(key,map.getOrDefault(key,0)+value);
}
for(Integer i : map.keySet()){
System.out.println(i+" "+map.get(i));
}
}
}
}