目录

hdoj刷题二(java):2010-2019

题目、分析与代码

Problem - 2010 水仙花数

再跳说不过去了,这里写一下, 个人觉得这里最难的是数位的拆分。有两种方法:

  1. 读取成数字,然后先取余,再除10,循环
  2. 读取成字符串,获取子串,再用 parseInt()

我的骨子里还是个 C语言 程序员,且第一种明显高效,这里用第一种

还有对于输出的处理,最后一个输出后没有空格,采取的方式见代码。

以及我犯的一个错误,判断是否为水仙花数,多次除10后,原数已经变成0,需要一个新变量记录原来的数,即那个变量 n。还有一种解决方式是,把 sum 等于 num,然后一个个减去,最后判断 sum 是不是0就行。

这题我 Presentation Error 好多次,太难受了!上面还有一点忘了,就是一组结束后,要加换行!

import java.util.Scanner;

/**
 * @author lhp
 * @description TODO
 * @date 2021/3/7 22:37
 */
public class P2010 {
    public static void main(String[] args) {
        int min, max;
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            min = sc.nextInt();
            max = sc.nextInt();
            int i=min;
            // 为了实现最后一个数字后没空格,这里把空格加到数字的前面
            // 所以第一个数字要特殊处理
            for (; i<=max; i++){
                if (isNarcissusNum(i)){
                    System.out.print(i);
                    // 这里i不自增的话和输出两遍第一个数
                    i++;
                    break;
                }
            }
            // 如果 i>max 说明一个数字也没
            if (i > max){
                System.out.print("no");
            }
            for (; i<=max; i++){
                if (isNarcissusNum(i)){
                    System.out.print(" " + i);
                }
            }
            //这里记得换行
            System.out.println();
        }
    }

    private static boolean isNarcissusNum(int num){
        int sum = 0, n =num;
        while (n > 0){
            int digit = n % 10;
            sum += digit * digit * digit;
            n /= 10;
        }
        return num == sum;
    }
}

Problem - 2011 多项式求和

这题就弄个 for 循环吧,应该能过

Problem - 2012 素数判定

这题很经典,LeetCode 刷过,用厄拉多塞筛法,直接当时的笔记拿过来。

解法一:暴力法(超时),不详细展开

解法二:暴力法优化,循环上限开个根号,循环步长改为2,即排除偶数

解法三:厄拉多塞筛法,顺序遍历(从2开始),每取得一个数,那么它的倍数就一定不是素数,筛去,以此类推,题解原文

题解代码:(哈哈哈这代码好像是当时复制的别人的 C++

int countPrimes(int n) {
    int count = 0;
    //初始默认所有数为质数
    vector<bool> signs(n, true);
    for (int i = 2; i < n; i++) {
        if (signs[i]) {
            count++;
            for (int j = i + i; j < n; j += i) {
                //排除不是质数的数
                signs[j] = false;
            }
        }
    }
    return count;
}

未完待续,要结合题目把这题写出来。

这题还学到了一个List初始化的方法:

//新建长度为n的 Boolean List,初始化为 true
List<Boolean> signs = new ArrayList<>(Collections.nCopies(n, true) );

Problem - 2013 蟠桃记

数学题,每次 + 1 再 *2

Problem - 2014 青年歌手大奖赛_评委会打分

使用 sort 函数排序

Problem - 2015 偶数求和

挨个加就好,不过先用 n / m * m 这个操作算出前面 n 的倍数,剩下的几个再根据数量算平均值

Problem - 2016 数据的交换输出

遍历就完事~

Problem - 2017 字符串统计

判断是否是数字可以这样,两种方法,我还是喜欢第一种偏C的

String s = "a1";
System.out.println('0'<=s.charAt(1) && s.charAt(1)<='9');   //输出true
System.out.println(Character.isDigit(s.charAt(1))); //输出true

Problem - 2018 母牛的故事

用一个数组递推即可

Problem - 2019 数列有序!

插入排序,注意以下几个细节:

  1. 哨兵
  2. 输出格式
    1. 最后一个数字后没有空格
    2. 记得每组输出后换行
import java.util.Scanner;

/**
 * @author lhp
 * @description TODO
 * @date 2021/3/8 19:31
 */
public class P2019 {
    public static void main(String[] args) {
        int m, n;
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            n = sc.nextInt();
            m = sc.nextInt();
            if (m == 0 && n == 0){
                break;
            }
            int[] nums = new int[n+2];
            for (int i=1; i<=n; i++){
                nums[i] = sc.nextInt();
            }
            nums[0] = m;
            int j = n;
            for (; nums[j] > nums [0]; j--){
                nums[j+1] = nums[j];
            }
            //注意这里是j+1
            nums[j+1] = m;
            for (int k=1; k<n+1; k++){
                System.out.print(nums[k] + " ");
            }
            //最后一个数字后没有空格,以及记得换行
            System.out.println(nums[n+1]);
        }
    }
}