杭电OJ2002、2003、2004、2005(java)

OJ2002

import java.util.Scanner;


import javax.sql.rowset.CachedRowSet;


public class Main2002{  
    private static Scanner in;
    public static void main(String[] args) {  
      Scanner in = new Scanner(System.in);
      final double PI = 3.1415927;
      while(in.hasNext()) {
     double R = in.nextDouble();
     double area = PI*R*R*R*(double)4/(double)3;
     System.out.println(String.format("%.3f", area));
  }
}
}

调试两次成功,第一次因为直接使用的  Math.PI 调取的圆周率,所以显示Time Limit,最后使用final解决问题(因为库函数中的圆周率太大)

OJ2003

import java.util.Scanner;


import javax.sql.rowset.CachedRowSet;


public class Main2003{  
    private static Scanner in;
    public static void main(String[] args) {  
      Scanner in = new Scanner(System.in);
      while(in.hasNext()) {
     double A = in.nextDouble();
     double B = Math.abs(A);
     System.out.println((String.format("%.2f", B)));
      }
}
}

新知识点:Math.abs()为取绝对值; 
                System.out.println((String.format("%.2f".B))); 输出对B保留两位小数

OJ2004

mport java.util.Scanner;


import javax.sql.rowset.CachedRowSet;


public class Main2004{  
    private static Scanner in;
    public static void main(String[] args) {  
      Scanner in = new Scanner(System.in);
      while(in.hasNext()) {
    int scor = in.nextInt();
    if(scor<0||scor>100)
    {
    System.out.println("Score is error!");
    }
    else if (scor>=90&&scor<=100) 
    {
System.out.println("A");
}
    else if(scor>=80)
    {
    System.out.println("B");
    }
    else if(scor>=70)
    {
    System.out.println("C");
    }
    else if(scor>=60)
    {
    System.out.println("D");
    }     
    else if(scor<60&&scor>=0)
    {
    System.out.println("E");
    }     
      }
}
}

OJ2005

import java.util.Scanner;


public class Main2005{  
    public static void main(String[] args) {  
      Scanner in = new Scanner(System.in);
      while (in.hasNext()) {
     int date[] = {31,28,31,30,31,30,31,31,30,31,30,31};
          int month = 0;
          int day;
     String string =in.next();
     String time[] = string.split("/");
     int []times = new int[time.length];
     for(int i=0;i<time.length;i++)
     {
     times[i]=Integer.parseInt(time[i]);
     }
     if ((times[0]%4==0&&times[0]%100!=0)||times[0]%400==0)
     {
 date[1] = 29;
 }
     for(int j = 0;j<times[1]-1;j++)
     {
     month = month+date[j]; 
     }
              day = month + times[2];
              System.out.println(day);
      }
}
}

新知识点:
1. times[i] = integer.parseInt(time[i]); 
(以下转自他人博客)







(1)int n = Integer.parseInt(args[0]) 表示给定义的变量n 赋予一个初值为"Integer.parseInt(args[0])";
(2)Integer.parseInt(args[0])中,Integer是java中的一个内置类,parseInt()是这个类的一个静态方法,这个方法的作用是把括号里面的参数(args[0])转为int型的值,比如定义一个String a="123",这时"a"是一个字符串,不能进行数值计算,如果你要让"a"能进行数值计算,你就可以用Integer.parseInt(a)这个函数把"a"转为int型再来进行数值计算

2. String time[] = string.split("/");

我们常常用String的split()方法去分割字符串,有两个地方值得注意:

 1. 当分隔符是句号时("."),需要转义:

由于String.split是基于正则表达式来分割字符串,而句号在正则表达式里表示任意字符。

//Wrong:
//String[] words = tmp.split(".");

//Correct:
String[] words = tmp.split("\\.");

所以,假设分隔符在正则表达式里有一定的意义时,需要格外留心,必须将它们转义才能达到分割的效果。

 2. 假设字符串最后有连续多个分隔符,且这些分隔符都需要被分割的话,需要调用split(String regex,int limit)这个方法:

String abc = "a,b,c,,,";
String[] str = abc.split(",");
        
System.out.println(Arrays.toString(str)+" "+str.length);
        
String[] str2 = abc.split(",",-1);
        
System.out.println(Arrays.toString(str2)+" "+str2.length);输出如下:

[a, b, c] 3
[a, b, c, , , ] 6

需要输出csv文件的时候,尤其需要注意。

 

3. 假设需要快速分割字符串,split()并不是最有效的方法。在split()方法内,有如下的实现:

1 public String[] split(String regex, int limit) {
2       return Pattern.compile(regex).split(this, limit);
3 }

频繁调用split()会不断创建Pattern这个对象,因此可以这样去实现,减少Pattern的创建:

1 //create the Pattern object outside the loop    
2 Pattern pattern = Pattern.compile(" ");
3 
4 for (int i = 0; i < 1000000; i++)
5 {
6     String[] split = pattern.split("Hello World", 0);
7     list.add(split);
8 }

另外split()也往往比indexOf()+subString()这个组合分割字符串要稍慢,详情可看这个帖子

我在本机做过测试,感觉indexOf()+subString()比split()快一倍:

 1 public static void main(String[] args) {
 2         StringBuilder sb = new StringBuilder();
 3         for (int i = 100000; i < 100000 + 60; i++)
 4             sb.append(i).append(' ');
 5         String sample = sb.toString();
 6 
 7         int runs = 100000;
 8         for (int i = 0; i < 5; i++) {
 9             {
10                 long start = System.nanoTime();
11                 for (int r = 0; r < runs; r++) {
12                     StringTokenizer st = new StringTokenizer(sample);
13                     List<String> list = new ArrayList<String>();
14                     while (st.hasMoreTokens())
15                         list.add(st.nextToken());
16                 }
17                 long time = System.nanoTime() - start;
18                 System.out.printf("StringTokenizer took an average of %.1f us%n", time / runs
19                         / 1000.0);
20             }
21             {
22                 long start = System.nanoTime();
23                 Pattern spacePattern = Pattern.compile(" ");
24                 for (int r = 0; r < runs; r++) {
25                     List<String> list = Arrays.asList(spacePattern.split(sample, 0));
26                 }
27                 long time = System.nanoTime() - start;
28                 System.out.printf("Pattern.split took an average of %.1f us%n", time / runs
29                         / 1000.0);
30             }
31             {
32                 long start = System.nanoTime();
33                 for (int r = 0; r < runs; r++) {
34                     List<String> list = new ArrayList<String>();
35                     int pos = 0, end;
36                     while ((end = sample.indexOf(' ', pos)) >= 0) {
37                         list.add(sample.substring(pos, end));
38                         pos = end + 1;
39                     }
40                 }
41                 long time = System.nanoTime() - start;
42                 System.out
43                         .printf("indexOf loop took an average of %.1f us%n", time / runs / 1000.0);
44             }
45         }
46     }


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值