hdoj刷题一(java):2000-2009
写在前面
本次刷题主要是针对复试,刷 hdoj 第11页的题,以前用的是 C++
,最近一年用 Java
做项目多,也是想着以后靠 Java
吃饭,所以换用 Java
。寒假在 LeetCode
刷了一些题,所以最近的刷题主要是习惯用 Java
做输入输出以及用 Java
写算法题(多留意常用 api
,背下来,考试手写)
下面是找到的一篇输入输出教程,足够应付了:
ACM之Java输入输出_以家为家,以乡为乡,以国为国,以天下为天下-CSDN博客_acm java输入输出
题目与代码
Problem - 2000 ASCII码排序
主要有两点:
- 读取字符的时候,先用
next()
读取,再转成字符串数组,或者用charAt()
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
刷过),主要练了以下几点:
-
Java
输入- 输入流建立
Scanner sc = new Scanner(System.in)
- 判断输入流是否结束,用
sc.hasNext()
- 读入一个字符串用
sc.next()
,数字用sc.nextInt()
,sc.nextDouble
,以此类推
- 输入流建立
-
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);
}
-
hdoj
的提交规范- 注意判断输入流结束
- 不能带有包名
- 将类名改为
Main
,这里是要将P2001
改为Main
-
细节问题,一开始没看到说输入是「实数」,被样例迷惑了
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 求绝对值
侮辱智商,跳过吧。两种做法:
Math.abs()
num = num > 0 ? num : -num
Problem - 2004
纯 if
语句
Problem - 2005 第几天?
以几下几个难点:
- 日期的处理,因为我对日期函数不熟悉,用原始的方式,读入字符串,然后
split
一下,再Integer.parseInt
- 闰年判断
- 计算第几天
- 利用不带 break 的 switch 累计天数,注意月份要倒着写
- 11月的话累计第10月,并继续往下累计9,8,,7,6,5,4,3,2,1月
- 这个方法还是大一的时候我的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
渲染是不是严格的,以前都是故意弄一个空行来区分段落,这次行末没加双空格也没加空格,看看格式会不会乱)
事实证明会自己换行,还挺智能。