Java基础知识练习01

1 日期计算

题目描述:
有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们
之间的天数为两天
输入:
有多组数据,每组数据有两行,分别表示两个日期,形式为 YYYYMMDD
输出:
每组数据输出一行,即日期差值
样例输入:
20110412
20110422
样例输出:
11

 1 package Test;
 2 //不用data类了,已经被更新为更好用的LocalDate类,适用于jdk8以上的版本
 3 import java.time.LocalDate;
 4 import java.time.format.DateTimeFormatter;
 5 import java.time.temporal.ChronoUnit;
 6 import java.util.Scanner;
 7 
 8 public class Main{
 9     public static void main(String[] args) {
10         Scanner sc=new Scanner(System.in);
11         while(sc.hasNext()){
12             //设定输入的字符串时间格式,并把字符串转换为时间
13             LocalDate ld1=LocalDate.parse(sc.next(),DateTimeFormatter.ofPattern("yyyyMMdd"));
14             LocalDate ld2=LocalDate.parse(sc.next(),DateTimeFormatter.ofPattern("yyyyMMdd"));
15             System.out.println(ld1.until(ld2, ChronoUnit.DAYS)+1);//计算二者相差时间
16         }
17     }
18 }
View Code

 2 进制转换

题目描述:

    求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
    不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。

输入:

    输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。

    数据可能存在包含前导零的情况。

输出:

    可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。

样例输入:
15 Aab3 7
样例输出:
210306
 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main{
 6     public static void main(String[] args) {
 7         Scanner sc=new Scanner(System.in);
 8         while(sc.hasNext()){
 9             int a=sc.nextInt();
10             String str=sc.next();//输入的数用字符串存储
11             int b=sc.nextInt();
12             int res=Integer.parseInt(str,a);//把输入的字符串换 
13  为整数
14             System.out.println(Integer.toString(res,b).toUpperCase());//把里面的字母转换为大写,输出格式要求的
15         }
16     }
17 }
View Code


 

3 又一版A+B

输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。

输入:
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
 当m为0时输入结束。
输出:
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。

样例输入:

8 1300 48
2 1 7
0
样例输出:

2504
1000

 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main{
 6     public static void main(String[] args) {
 7         Scanner sc=new Scanner(System.in);
 8         while(sc.hasNext()){
 9             int m=sc.nextInt();
10             if(m==0) break; //直接跳出,程序结束了
11             long a=sc.nextInt();
12             long b=sc.nextInt();    
13             // Long是long的封装,是一个对象类型而long是基本的数据类型
14             System.out.println(Long.toString(a+b,m));//这里进制转换就没有考虑大小写,根据不同题目要求而定
15         }
16     }
17 }
View Code

 4 进制转换

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。

输入例子:

0xA

输出例子:

10

 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main{
 6     public static void main(String[] args) {
 7         Scanner sc=new Scanner(System.in);
 8         while(sc.hasNext()){
 9             String str=sc.next();
10             System.out.println(Integer.parseInt(str.substring(2),16));//要跳过前两个字符0X
11         }
12     }
13 }
View Code

 5 IP地址

Description

输入一个ip地址串,判断是否合法。

Input

IP地址的形式为a.b.c.d,其中a、b、c、d都是整数。

Output

可能有多组测试数据,对于每组数据,如果IP地址合法则输出"Yes!”,否则输出"No!”。

Sample Input

255.255.255.255
512.12.2.3

Sample Output

Yes!
No!

Hint

ip地址形如 a.b.c.d
要满足
0<=a,b,c,d<=255

 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main{
 6     public static void main(String[] args) {
 7         Scanner sc=new Scanner(System.in);
 8         while(sc.hasNext()){
 9             String[] str=sc.nextLine().split("\\.");//对于字符串的分割可以直接以.作为标记,但涉及数字时要加\\
10             int flag=0;
11             for(int i=0;i<str.length;i++){
12                 if(Integer.parseInt(str[i])>255||Integer.parseInt(str[i])<0){
13                   flag=1;
14                   break;
15                 }
16             }
17             if(flag==1) System.out.println("No!");
18             else System.out.println("Yes!");
19         }
20     }
21 }

 6 二进制数

题目描述:

大家都知道,数据在计算机里中存储是以二进制的形式存储的。 有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗?并且,小明不想要二进制串中前面的没有意义的0串,即要去掉前导0。

输入描述:

每行有一个数字n(0<=n<=10^8),表示要求的二进制串。
输出:
每行输出求得的二进制串。
 
  
 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main{
 6     public static void main(String[] args) {
 7         Scanner sc=new Scanner(System.in);
 8         while(sc.hasNext()){
 9             //Java中没有unsigned int这个数据类型。题目中10^8没有超过int的范围所以仍可以用int
10             int n=sc.nextInt();
11             System.out.println(Integer.toBinaryString(n));
12         }
13     }
14 }
 
  

 7 10进制 VS 2进制

题目描述:

    对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
    例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

输入:

    一个1000位(即10^999)以内的十进制数。

输出:

    输入的十进制数的二进制逆序数。

样例输入:
173
样例输出:
181
 1 package Test;
 2 
 3 import java.io.BufferedInputStream;
 4 import java.math.BigInteger;
 5 import java.util.Scanner;
 6 
 7 public class Main {
 8     public static void main(String args[]) {
 9         Scanner sc = new Scanner(new BufferedInputStream(System.in));
10         while (sc.hasNext()) {
11         BigInteger n=new BigInteger(sc.nextLine());//1000位的十进制整数用大数形式保存
12         StringBuilder sb=new StringBuilder(n.toString(2));
13         sb.reverse();
14         n=new BigInteger(sb.toString(),2);//把字符串换为十进制的大数
15         System.out.println(n.toString());
16         }
17     }
18 }

 

 

8 统计字符串

题目描述:
统计一个给定字符串中指定的字符出现的次数。
输入:
测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过5的字符串,第2行为一个长度不超过80的字符串。注意这里的字符串包含空格,即空格也可能是要求被统计的字符之一。当读到'#'时输入结束,相应的结果不要输出。
输出:
对每个测试用例,统计第1行中字符串的每个字符在第2行字符串中出现的次数,按如下格式输出:
c0 n0
c1 n1
c2 n2
...
其中ci是第1行中第i个字符,ni是ci出现的次数。
样例输入:
I
THIS IS A TEST
i ng
this is a long test string
#
样例输出:
I 2
i 3
5
n 2
g 2

 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main{
 6     public static void main(String[] args) {
 7         Scanner sc=new Scanner(System.in);
 8         while(sc.hasNext()){
 9             String str1=sc.nextLine();
10             String str2=sc.nextLine();
11             if(str1.equals("#"))//输入"#"表示结束
12                 break;
13             int length=str1.length();
14             int[] arr=new int[length];//用来保存结果
15             for(int i=0;i<length;i++){
16                 for(int j=0;j<str2.length();j++){
17                     if(str1.charAt(i)==str2.charAt(j)){
18                         arr[i]++;
19                     }                    
20                 }            
21             }
22             for(int i=0;i<length;i++){
23                 System.out.println(str1.charAt(i)+" "+arr[i]);
24             }
25         }
26     }
27 }

 9 打印日期

题目描述
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据,
按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
示例1
输入
2000 3
2000 31
2000 40
2000 60
2000 61
2001 60
输出
2000-01-03
2000-01-31
2000-02-09
2000-02-29
2000-03-01
2001-03-01

 1 package Test;
 2 import java.time.LocalDate; 5 import java.util.Scanner;
 6 
 7 public class Main{
 8     public static void main(String[] args) {
 9         Scanner sc=new Scanner(System.in);
10         while(sc.hasNext()){
11             int year=sc.nextInt();
12             int day=sc.nextInt();
13             System.out.println(LocalDate.of(year, 1, 1).plusDays(day-1));
14         }
15     }
16 }

 10 对称矩阵

题目描述
输入一个N维矩阵,判断是否对称。
输入描述:
输入第一行包括一个数:N(1<=N<=100),表示矩阵的维数。
接下来的N行,每行包括N个数,表示N*N矩阵的元素。
输出描述:
可能有多组测试数据,对于每组数据,
输出"Yes!”表示矩阵为对称矩阵。
输出"No!”表示矩阵不是对称矩阵。
示例1
输入
4
16 19 16 6
19 16 14 5
16 14 16 3
6 5 3 16
2
1 2
3 4
输出
Yes!
No!

 1 package Test;
 2 //不用创建student对象直接存储到map中
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 import java.util.Scanner;
 6 
 7 public class Main{
 8     public static void main(String[] args) {
 9         Scanner sc=new Scanner(System.in);
10         while(sc.hasNext()){    
11             int n=sc.nextInt();
12             sc.nextLine();//在这里可以不用str接收的,只是后面不用在定义了
13             int[][] arr=new int[n][n];    
14             for(int i=0;i<n;i++){
15                 String[]str=sc.nextLine().split(" ");
16                 for(int j=0;j<n;j++){
17                     arr[i][j]=Integer.parseInt(str[j]);
18                 }
19             }
20             new Jude().judege(arr, n);
21         }
22     }
23 }
24 
25 class Jude{
26     public void judege(int[][]arr,int row){
27         for(int i=0;i<row;i++){
28             for(int j=i+1;j<row;j++){
29                 if(arr[i][j]!=arr[j][i]){
30                     System.out.println("No!");
31                     return;
32                 }
33             }            
34         }
35         System.out.println("Yes!");
36     }
37 }

 11 密码翻译

题目描述
在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别。我们给出一种最简的的加密方法,对给定的一个字符串,把其中从a-y,A-Y的字母用其后继字母替代,把z和Z用a和A替代,则可得到一个简单的加密字符串。
输入描述:
读取这一行字符串,每个字符串长度小于80个字符
输出描述:
对于每组数据,输出每行字符串的加密字符串。
示例1
输入
Hello! How are you!
输出
Ifmmp! Ipx bsf zpv!

 1 package Test;
 2 
 3 import java.util.Scanner;
 4 
 5 public class Main{
 6     public static void main(String[] args) {
 7         Scanner sc=new Scanner(System.in);
 8         while(sc.hasNext()){    
 9             String str=sc.nextLine();
10             String str2="";//必须要初始化为空字符串
11             for(int i=0;i<str.length();i++){
12                 if((str.charAt(i)>='a'&&str.charAt(i)<'z')||(str.charAt(i)>='A'&&str.charAt(i)<'Z')){
13                     int a=(int)str.charAt(i)+1;
14                     str2=str2+(char)a;                
15                 }        
16                 else if(str.charAt(i)=='z') str2=str2+'a';            
17                 else if(str.charAt(i)=='Z') str2=str2+'A';
18                 else  str2=str2+str.charAt(i);
19             }
20             System.out.println(str2);
21         }
22     }
23 }

 12 字符串计算

题目描述
给出一个01字符串(长度不超过100),求其每一个子串出现的次数。
输入描述:
输入包含多行,每行一个字符串。
输出描述:
对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。
示例1
输入
10101
输出
0 2
01 2
1 3
10 2
101 2

 1 package Test;
 2 
 3 import java.util.Map;
 4 import java.util.Scanner;
 5 import java.util.TreeMap;
 6 
 7 public class Main{
 8     public static void main(String[] args) {
 9         Scanner sc= new Scanner(System.in);
10         while(sc.hasNext()){
11             String str=sc.nextLine();
12             //把字符串当做key,出现次数为value,TreeMap 默认排序规则:按照key的字典顺序来排序(升序)
13             Map<String, Integer> map=new TreeMap<String,Integer>();
14             for(int i=0;i<str.length();i++){
15                 for(int j=1;i+j<=str.length();j++){
16                     String s=str.substring(i,i+j);//截取字符串i和i+j之间的字符
17                     if(map.containsKey(s))
18                         map.put(s, map.get(s)+1);
19                     else
20                         map.put(s, 1);
21                 }
22             }
23             //map.keySet()获取map中的key值列表
24             for(String key:map.keySet()){
25                 if(map.get(key)>1)
26                     System.out.println(key+" "+map.get(key));
27             }
28         }
29     }
30 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值