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

简介: 算法题目,Java语言版

第一题

题目介绍

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

解题思路

代码实现

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;
    }
}
目录
相关文章
|
11天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
12天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
37 1
|
20天前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
27天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
41 3
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
130 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
22 0