第一题
题目介绍
输入一些数值,求出现的次数最多的数。如果有多个并列,则从大到小输出。
解题思路
代码实现
package com.nineWeek;
import java.util.*;
/**
* @author WangYH
* @version 2021.1.3
* @date 2023/5/7 18:29
*/
public class NumMostTimes {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Map<Integer, Integer> countMap = new HashMap<>();
System.out.println("输入整数时,输入 # 表示输入完成");
while (scanner.hasNextInt()) {
int num = scanner.nextInt();
int count = countMap.getOrDefault(num, 0);
countMap.put(num, count + 1);
}
List<Map.Entry<Integer, Integer>> entryList = new ArrayList<>(countMap.entrySet());
Collections.sort(entryList, ((o1, o2) -> {
int cmp = o2.getValue() - o1.getValue();
if (cmp == 0) {
cmp = o2.getKey() - o1.getKey();
}
return cmp;
}));
int maxCount = entryList.get(0).getValue();
for (int i = 0; i < entryList.size(); i++) {
int count = entryList.get(i).getValue();
if (count != maxCount) {
break;
}
System.out.print(entryList.get(i).getKey() + " ");
}
}
}
第二题
题目介绍
编程生成一个N阶矩阵,使其主对角线右侧相邻上元素皆为1,与主对角线左侧相邻元素皆为2,其余元素皆为0.
解题思路
代码实现
package com.nineWeek;
import java.util.Scanner;
/**
* @author WangYH
* @version 2021.1.3
* @date 2023/5/7 23:26
*/
public class generateMatrix {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] matrix = generateMatrix(n);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
System.out.print(matrix[i][j]);
}
System.out.println();
}
}
public static int[][] generateMatrix(int n) {
int[][] matrix = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (j == i + 1) {
matrix[i][j] = 1;
} else if (j == i - 1) {
matrix[i][j] = 2;
} else {
matrix[i][j] = 0;
}
}
}
return matrix;
}
}
第三题
题目介绍
输入若干个单词,输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开
解题思路
代码实现
package com.nineWeek;
import java.util.Scanner;
/**
* @author WangYH
* @version 2021.1.3
* @date 2023/5/14 16:28
*/
public class WordCount {
public static void main(String[] args) {
String str;
Scanner sc = new Scanner(System.in);
str = sc.nextLine();
System.out.println(getAverageWordLength(str));
}
public static double getAverageWordLength(String input) {
String[] words = input.split("\\s+");
int wordCount = words.length;
int totalLength = 0;
for (String word : words) {
totalLength += word.length();
}
return ((double)totalLength) / wordCount;
}
}
第四题
题目介绍
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
解题思路
代码实现
package com.nineWeek;
import java.util.Scanner;
/**
* @author WangYH
* @version 2021.1.3
* @date 2023/5/14 16:35
*/
public class CharStatisticg {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一行字符串");
String input = sc.nextLine();
int letterCount = 0;
int spaceCount = 0;
int digitCount = 0;
int otherCount = 0;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (Character.isLetter(c)){
letterCount++;
}else if (Character.isDigit(c)) {
digitCount++;
}else if(Character.isWhitespace(c)){
spaceCount++;
}else {
otherCount++;
}
}
System.out.println("字母个数 " + letterCount);
System.out.println("数字个数 " + digitCount);
System.out.println("空格个数 " + spaceCount);
System.out.println("其他字符个数 " + otherCount);
}
}
第五题
题目介绍
这是一个古老而又经典的问题。用给定的几种钱币凑成某个钱数,一般而言有多种方式。例如:给定了6种钱币面值为2、5、10、20、50、100,用来凑15元,可以用5个2元、1个5元,或者3个5元,或者1个5元、1个10元,等等。显然,最少需要2个钱币才能凑成15元。
你的任务就是,给定若干个互不相同的钱币面值,编程计算,最少需要多少个钱币才能凑成某个给出的钱数。
【要求】
【Input】
测试用例的第一行是待凑的钱数值M(1 <= M<= 2000,整数),接着的一行中,第一个整数K(1 <= K <= 10)表示币种个数,随后是K个互不相同的钱币面值Ki(1 <= Ki <=1000)。
【Output】
测试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。
【样例输入1】
15
6 2 5 10 20 50 100
【样例输出1】
2
【样例输入2】
1
1 2
【样例输出】
Impossible
解题思路
代码实现
package com.nineWeek;
import java.util.Arrays;
/**
* @author WangYH
* @version 2021.1.3
* @date 2023/5/14 16:54
*/
public class ScrapeTogetherMoney {
public static void main(String[] args) {
int[] coins = {6,2,5,10,20,50,100};
int amount = 15;
int minCoins = minCoins(coins, amount);
System.out.println("Minimum number of coins required to make " + amount + " is: " + minCoins);
}
public static int minCoins(int[] coins, int target) {
int[] dp = new int[target + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for (int i = 1; i <= target; i++) {
for (int coin : coins) {
if (coin <= i && dp[i - coin] != Integer.MAX_VALUE) {
dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
}
}
}
return dp[target] == Integer.MAX_VALUE ? -1 : dp[target];
}
}
第六题
题目介绍
按照键盘输入的数值N的大小,打印如下图形
N为图形的行数。要求使用循环实现。
【Input】
显示的行数
【Output】
对应图形。
【样例输入:】
9(如图)
解题思路
代码实现
package com.sixWeek;
import java.util.Scanner;
/**
* @author WangYH
* @version 2021.1.3
* @date 2023/4/1 17:14
*/
public class Algo_6 {
public static void main(String[] args) {
/**
* 打印指定行数棱形图案
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入图案行数");
int n = sc.nextInt();
int N = n / 2;
System.out.println("输入要打印的字符");
char ch = sc.next().charAt(0);
for (int i = -N; i < (N + 1); i++) {
int absN = Math.abs(i);
//获取总行数和绝对值之间得差距,判断需要打印多少个指定字符
int diff = N-absN;
for (int j = -N; j < (N + 1); j++) {
int absj = Math.abs(j);
//将判断条件改成小于等于,可以打印实心得棱形
if (absj == diff){
System.out.print(ch);
}else {
System.out.print(" ");
}
}
System.out.println();
}
}
}
第七题
题目介绍
莫比乌斯函数,使用miu(n) 作为莫比乌斯函数的记号。具体定义如下:如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。如果一个数不包含平方因子,并且有k个不同的质因子,那么miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1), miu(6), miu(10) = 1。给出一个数n, 计算miu(n)。
解题思路
代码实现
package com.nineWeek;
import java.util.Scanner;
/**
* @author WangYH
* @version 2021.1.3
* @date 2023/5/14 21:18
*/
public class Mobius {
public static void main(String[] args) {
int n;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
System.out.println(miu(n));
}
public static int miu(int n) {
int count = 0;
for (int i = 2; i * i <= n; i++) {
if (n % (i * i) == 0) {
// 包含平方因子,直接返回 0
return 0;
}
if (n % i == 0) {
count++;
n /= i;
while (n % i == 0) {
n /= i;
count++;
}
}
}
if (n > 1) {
// 处理最后一个质因子
count++;
}
return (count % 2 == 0) ? 1 : -1;
}
}