目录

hdoj刷题一(java):2000-2009

写在前面

本次刷题主要是针对复试,刷 hdoj 第11页的题,以前用的是 C++,最近一年用 Java 做项目多,也是想着以后靠 Java 吃饭,所以换用 Java。寒假在 LeetCode 刷了一些题,所以最近的刷题主要是习惯用 Java 做输入输出以及用 Java 写算法题(多留意常用 api,背下来,考试手写)

下面是找到的一篇输入输出教程,足够应付了:

ACM之Java输入输出_以家为家,以乡为乡,以国为国,以天下为天下-CSDN博客_acm java输入输出

题目与代码

Problem - 2000 ASCII码排序

主要有两点:

  1. 读取字符的时候,先用 next() 读取,再转成字符串数组,或者用 charAt()
  2. System.out.println(s[0] + " "+ s[1] + " " + s[2]); 这里的 " ",不能改成 ' '
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author lhp
 * @description TODO
 * @date 2021/3/7 15:00
 */
public class P2000 {
    public static void main(String[] args) {
        char[] s = new char[3];
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            s = sc.next().toCharArray();
            if (s[0] > s[1]){
                swap(s, 0, 1);
            }
            if (s[0] > s[2]){
                swap(s, 0, 2);
            }
            if (s[1] > s[2]){
                swap(s, 1, 2);
            }
            System.out.println(s[0] + " "+ s[1] + " " + s[2]);
        }
    }

    static void swap(char[] s, int i, int j){
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }
}

Problem - 2001 计算两点间的距离

这是我今年在 hdoj上做的第一道题(有不少以前用 C 刷过),主要练了以下几点:

  1. Java 输入

    1. 输入流建立 Scanner sc = new Scanner(System.in)
    2. 判断输入流是否结束,用 sc.hasNext()
    3. 读入一个字符串用 sc.next(),数字用 sc.nextInt()sc.nextDouble,以此类推
  2. Double 的格式化输出,摘抄上面博客的一段内容

   // 这里0指一位数字,#指除0以外的数字(如果是0,则不显示),四舍五入.
   DecimalFormat fd = new DecimalFormat("#.00#");
   DecimalFormat gd = new DecimalFormat("0.000");
   System.out.println("x =" + fd.format(x));
   System.out.println("x =" + gd.format(x));
      
   public static void main(String[] args) {
       NumberFormat formatter = new DecimalFormat("000000");
       String s = formatter.format(-1234.567); // -001235
       System.out.println(s);
       formatter = new DecimalFormat("##");
       s = formatter.format(-1234.567); // -1235
       System.out.println(s);
       s = formatter.format(0); // 0
       System.out.println(s);
       formatter = new DecimalFormat("##00");
       s = formatter.format(0); // 00
       System.out.println(s);
       formatter = new DecimalFormat(".00");
       s = formatter.format(-.567); // -.57
       System.out.println(s);
       formatter = new DecimalFormat("0.00");
       s = formatter.format(-.567); // -0.57
       System.out.println(s);
       formatter = new DecimalFormat("#.#");
       s = formatter.format(-1234.567); // -1234.6
       System.out.println(s);
       formatter = new DecimalFormat("#.######");
       s = formatter.format(-1234.567); // -1234.567
       System.out.println(s);
       formatter = new DecimalFormat(".######");
       s = formatter.format(-1234.567); // -1234.567
       System.out.println(s);
       formatter = new DecimalFormat("#.000000");
       s = formatter.format(-1234.567); // -1234.567000
       System.out.println(s);
       formatter = new DecimalFormat("#,###,###");
       s = formatter.format(-1234.567); // -1,235
       System.out.println(s);
       s = formatter.format(-1234567.890); // -1,234,568
       System.out.println(s);
       // The ; symbol is used to specify an alternate pattern for negative values
       formatter = new DecimalFormat("#;(#) ");
       s = formatter.format(-1234.567); // (1235)
       System.out.println(s);
       // The ' symbol is used to quote literal symbols
       formatter = new DecimalFormat(" '# '# ");
       s = formatter.format(-1234.567); // -#1235
       System.out.println(s);
       formatter = new DecimalFormat(" 'abc '# ");
       s = formatter.format(-1234.567); // - abc 1235
       System.out.println(s);
       formatter = new DecimalFormat("#.##%");
       s = formatter.format(-12.5678987);
       System.out.println(s);
   }
  1. hdoj 的提交规范

    1. 注意判断输入流结束
    2. 不能带有包名
    3. 将类名改为 Main,这里是要将 P2001 改为 Main
  2. 细节问题,一开始没看到说输入是「实数」,被样例迷惑了

import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Scanner;

/**
 * @author lhp
 * @description TODO
 * @date 2021/3/7 15:00
 */
public class P2001 {
    public static void main(String[] args) {
        double[] coor = new double[4];    //坐标,分别为x1, y1, x2, y2
        Arrays.fill(coor, 0);
        Scanner sc = new Scanner(System.in);
        DecimalFormat df = new DecimalFormat("#.00");
        while (sc.hasNext()){
            for (int i=0; i<4; i++){
                coor[i] = sc.nextDouble();
            }
            // 计算距离,因为是平方,所以谁减谁问题不大
            double dis = Math.sqrt( (coor[0]-coor[2])*(coor[0]-coor[2]) + (coor[1]-coor[3])*(coor[1]-coor[3]));
            System.out.println(df.format(dis));
        }
    }
}

Problem - 2002 计算球体积

import java.text.DecimalFormat;
import java.util.Scanner;

/**
 * @author lhp
 * @description TODO
 * @date 2021/3/7 21:45
 */
public class P2002 {
    private static final double PI = 3.1415927;
    public static void main(String[] args) {
        double r;
        double k = 4.0/3 * PI;  //4/3 * pi作为一个常数提前算出来应该能快点
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            r = sc.nextDouble();
            DecimalFormat df = new DecimalFormat("#.000");
            System.out.println(df.format(k * r * r * r));
        }
    }
}

Problem - 2003 求绝对值

侮辱智商,跳过吧。两种做法:

  1. Math.abs()
  2. num = num > 0 ? num : -num

Problem - 2004

if 语句

Problem - 2005 第几天?

以几下几个难点:

  1. 日期的处理,因为我对日期函数不熟悉,用原始的方式,读入字符串,然后 split 一下,再 Integer.parseInt
  2. 闰年判断
  3. 计算第几天
    1. 利用不带 break 的 switch 累计天数,注意月份要倒着写
    2. 11月的话累计第10月,并继续往下累计9,8,,7,6,5,4,3,2,1月
    3. 这个方法还是大一的时候我的C语言程序设计老师郑老师教我的,也是我的编程启蒙老师,教我我很多
import java.util.Scanner;

/**
 * @author lhp
 * @description TODO
 * @date 2021/3/7 21:56
 */
public class P2005 {
    public static void main(String[] args) {
        String dateStr;
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()){
            dateStr = sc.next();
            String[] dateArray = dateStr.split("/");
            int year = Integer.parseInt(dateArray[0]);
            int month = Integer.parseInt(dateArray[1]);
            int day = Integer.parseInt(dateArray[2]);
            int result = 0;
            //利用不带 break 的 switch 累计天数,注意月份要倒着写
            //2月的话累计1月的,3月累计1月2月的
            switch (month){
                case 12:result += 30;
                case 11:result += 31;
                case 10:result += 30;
                case 9:result += 31;
                case 8:result += 31;
                case 7:result += 30;
                case 6:result += 31;
                case 5:result += 30;
                case 4:result += 31;
                case 3:result += (28 + (isLeapYear(year) ? 1 : 0)); //处理闰年
                case 2: result += 31;
                default: break;
            }
            result += day;
            System.out.println(result);
        }
    }

    private static boolean isLeapYear(int year){
        return year % 4 == 0 && year %100 != 0 ||year % 400 == 0;
    }
}

Problem - 2006 求奇数的乘积

侮辱智商,跳过。只是输入稍微有点麻烦,先用 hasNext() 判断是否有新行,并读取数字个数 n,然后再用个循环读取就行

Problem - 2007 平方和与立方和

同侮辱智商,跳过

Problem - 2008 数值统计

同侮辱智商,跳过

Problem - 2009 求数列的和

Math.sqrt() ,不需要 import

总结

自己的编程基础应该还是不错的,高中就学过一点点 C++,大学 C语言 接近满绩,算法课比较水所以最后满绩,真不是故意跳那么多,一个是这些的确是签到题,一个是事情太多了,毕业设计,复试七本书和算法,新苗,人快没了。这是我第一次这么认真写刷题笔记,以后博客也要认真坚持写下来,加油。

P2000,P2001,P2002,练习了输入输出,以及数字的四舍五入。

P2005 练了练快两个星期没刷算法的手,以及最基本的几个常用函数。

(顺便利用这篇文章测试一下 hexo 的博客, markdown 渲染是不是严格的,以前都是故意弄一个空行来区分段落,这次行末没加双空格也没加空格,看看格式会不会乱)

事实证明会自己换行,还挺智能。