我的算法基础实验代码-下篇

8 篇文章 0 订阅

第一题

题目介绍

输入一些数值,求出现的次数最多的数。如果有多个并列,则从大到小输出。

解题思路

代码实现

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值