JAVA作业6&实验6

7-1 字符串 (20分)

对于输入字符串s(假设字符串只包含字母构成的单词和空格),完成如下功能:

统计该字符串中字母c出现的次数
求该字符串的逆
输出该字符串中子串str的所有位置(无需考虑子串叠加现象)
将字符串中每个单词的第一个字母变成大写并输出
输入格式:
字符串s 字母c 子串str

输出格式:
c在s中出现的次数 s的逆 str在s中的所有位置 所有单词首字母大写后的字符串

输入样例:
在这里给出一组输入。例如:

I scream you scream we all scream for icecream
m
eam

输出样例:
在这里给出相应的输出。例如:

4
maerceci rof maercs lla ew maercs uoy maercs I
5 16 30 43
I Scream You Scream We All Scream For Icecream


import java.util.Scanner;
public class Main {
     
    public static void main(String[] args) {
     
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        String strc=sc.nextLine();//待输入字母,因为Java中没有直接读取单个字符的函数,
        //所以将字母输入到字符串中,调用String中的charAt()函数
        //取第一个字符即为我们想要输入的单个字符
        char c=strc.charAt(0);
        String str=sc.nextLine();
        char []ns=s.toCharArray();
        int count=0;
       // System.out.println(ns);
        for (int i = 0; i < ns.length ; i++) {
     
            if(ns[i]==c){
     
                count++;
            }
        }
        System.out.println(count);
        for (int i = 0; i < ns.length/2 ; i++) {
     
            char temp=ns[i];
            ns[i]=ns[ns.length-i-1];
            ns[ns.length-i-1]=temp;
        }
        System.out.println(ns);
        int head=0;
        int []arr=new int[s.length()];
        String []nns=s.split(" ");//将句子中的各个单词分隔
        int j=0;
        int preStrLength=0;
        while(true)
        {
     
            //indexOf——返回指定字符第一次出现的字符串内的索引
            int n = s.indexOf(str);
            //找不到返回-1,循环结束
            if (n == -1) {
     
                break;
            }
            //存储找到的值(下标)
            //arr[j++]=n;
            //第一次head=0,从0开始找,之后head变为下标n+要找字符串的长度
            //应该从这里开始查找该子串,不加长度会出问题的!
            //head = n + str.length();
            if(j != 0)
                System.out.print(' ');
            //break;
            System.out.print((n + preStrLength));//字符串位置
            j++;
            s= s.substring(n +str.length());//截取
            preStrLength +=(n +str.length());
        }
//        System.out.print(arr[0]);
//        for (int i = 1; i < j ; i++) {
     
//            System.out.print(" " + arr[i]);
//        }
        System.out.println();

        String s1=new String();
        for (int i = 0; i < nns.length ; i++) {
     
            if(i==nns.length-1)
            s1+=nns[i].substring(0,1).toUpperCase()+nns[i].substring(1);
            else
            s1+=nns[i].substring(0,1).toUpperCase()+nns[i].substring(1)+" ";

        }


        System.out.println(s1);
        sc.close();
    }
}
/*I scream you scream we all scream for icecream
m
eam*/

7-2 镜像字符串 (20分)

镜像字符串是两个字符序列完全相反的字符串。从键盘录入两个不包含空格的字符串,判断第二个是否为第一个的镜像字符串,是则输出yes,否则输出no.

输入格式:
键盘录入的由一个空格分隔的两个字符串

输出格式:
yes(no)

输入样例:
在这里给出一组输入。例如:

abc cba

输出样例:
在这里给出相应的输出。例如:

yes
import java.util.Scanner;
public class Main{
     
    public static void main(String[] args) {
     
        Scanner cin=new Scanner(System.in);
        String s1=cin.next();
        String s2=cin.next();
        String ns1=new StringBuffer(s1).reverse().toString();
        if(ns1.equals(s2))
            System.out.println("yes");
        else System.out.println("no");
        cin.close();
    }
}

7-3 单词在句子中的位置 (20分)

给定英文句子,编写方法void wordPositions(String sentence),该方法中计算sentence中的每个单词在句子中的起始位置和单词长度并输出。假设句子中只包含英文字母和空格,且单词不重复。

输入格式:
句子

输出格式:
每个单词在句子中的起始位置和单词长度

输入样例:
在这里给出一组输入。例如:

Why are you so crazy about java

输出样例:
在这里给出相应的输出。例如:

Why: 0, 3
are: 4, 3
you: 8, 3
so: 12, 2
crazy: 15, 5
about: 21, 5
java: 27, 4
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main{
     
    public static void main(String[] args) {
     
          Scanner sc=new Scanner(System.in);
          String s=sc.nextLine();
          Statistics st=new Statistics();
          st.wordPositions(s);
          sc.close();
    }
}
class Statistics{
     

    int []count;//统计单词长度
    String []ns;//纪录单词
    List<Integer>pos =new LinkedList<>();//记录单词出现位置

    public Statistics() {
     
        count=new int[100];
    }

    public void wordPositions(String sentence)
    {
     
        for (int i = 0; i < sentence.length() ; i++) {
     
            if(i==0)
            {
     
                pos.add(i);
            }
            else if(sentence.charAt(i-1)==' ')
            {
     
                pos.add(i);
            }
        }
        ns=sentence.split(" ");//将句子转化为字符串数组
        for (int i = 0; i < ns.length ; i++) {
     
             count[i]=ns[i].length();
            }
        for (int i = 0; i <ns.length ; i++) {
     
            System.out.println(ns[i]+": "+pos.get(i)+", "+count[i]);
        }
    }
}
/*Why are you so crazy about java*/

7-4 打印双休日 (20分

)
输入年份和月份,打印当月所有双休日日期,打印格式为:“2018-06-16”

输入格式:
年份和月份

输出格式:
双休日日期

输入样例:
在这里给出一组输入。例如:

2018 6

输出样例:
在这里给出相应的输出。例如:

2018-06-02
2018-06-03
2018-06-09
2018-06-10
2018-06-16
2018-06-17
2018-06-23
2018-06-24
2018-06-30

ans:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.text.ParsePosition;
import java.util.Calendar;
import java.util.Scanner;
import java.util.Date;

public class Main{
     
    public static void main(String[] args) throws ParseException {
     
        Scanner input=new Scanner(System.in);
//        int year=input.nextInt();
//        int month=input.nextInt();
        String str=input.nextLine();

        SimpleDateFormat df1=new SimpleDateFormat("yyyy MM");//输入形式
        SimpleDateFormat df2=new SimpleDateFormat("yyyy-MM-dd");//输出形式

        Calendar cal=Calendar.getInstance();//使用默认时区和区域设置获取日历。
        cal.clear();// 将此 Calendar 的所日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义。
        cal.setTime(df1.parse(str));// 使用给定的 Date 设置此 Calendar 的时间。
            // parse(String text, ParsePosition pos) 解析字符串的文本,生成 Date。
        for (int i = 0; i < cal.get(Calendar.DAY_OF_MONTH); i++) {
     //查询范围为某月
            if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY||cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)
            {
     
                System.out.println(df2.format(cal.getTime()));// 返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
            }
            cal.add(Calendar.DAY_OF_MONTH,1);//天数+1
        }
        input.close();
    }
}

6-1 Duplicated Words (20分)

This program reads a lot of words, in which may be duplicated words. The program picks out all the duplicated ones and sorts the remainders in a descendent order.

函数接口定义:

public static ArrayList<String> pick(ArrayList<String> a);

a is the ArrayList to be parsed and returns the result as an ArrayList.
裁判测试程序样例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Scanner;

public class Main {
     
    /* 请在这里填写答案 */

    public static void main(String[] args) {
     
        ArrayList<String> lst = new ArrayList<>();
        Scanner in = new Scanner(System.in);
        while ( in.hasNext() ) {
     
            lst.add(in.next());
        }
        lst = pick(lst);
        for ( String x:lst) {
     
            System.out.print(x+" ");
        }
        System.out.println();
        in.close();
    }
}

输入样例:

this is a test at this Zhejiang University

输出样例:

this test is at a Zhejiang University 
	public static ArrayList<String> pick(ArrayList<String> a)    {
     
        ArrayList<String> rs = new ArrayList<String>();
        for(int i=0;i<a.size();i++) {
         
            if(!rs.contains(a.get(i))) {
     
                rs.add(a.get(i));
            }
        }
        Collections.sort(rs);
        Collections.reverse(rs);
        return rs;
	}

7-1 约瑟夫环问题-hebust (20分)

约瑟夫环问题

约瑟夫环是一个数学的应用问题:已知n个人(以编号a,b,c…分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

输入格式:
固定为2行,第一行为m,第二行为n个人的名称列表,用英文字母代表,元素直接使用英文逗号 , 分开

输出格式:
一行,为出列元素序列,元素之间使用英文逗号 , 分开【注意:末尾元素后没有逗号】

输入样例:
在这里给出一组输入。例如:

3
a,b,c,d,e,f,g

输出样例:
在这里给出相应的输出。例如:

c,f,b,g,e,a,d

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class Main {
     
	public static void  main(String []args)
	{
     
		Scanner cin=new Scanner(System.in);
		int a=cin.nextInt();
		cin.nextLine();
		String s=cin.nextLine();
		String []ns=s.split(",");
		List arrayList=new ArrayList<String>();
		for(int i=0;i<ns.length;i++)
		{
     
			arrayList.add(ns[i]);
		}
		
		int f=0;//记录每个人报的数
		
		while(arrayList.size()>0)
		{
     
			Iterator it=arrayList.iterator();
			
			while (it.hasNext())
			{
     
				String nns=(String)it.next();
				if(f==a-1)
				{
     
					if( arrayList.size() > 1) {
     
						System.out.print(nns + ",");
					}
					else {
     
						System.out.println(nns);
					}
					it.remove();
				}
				f = ( f + 1) % a;
				}
			}
		cin.close();
	}

}

7-2 找出最长的单词-hebust (20分)

找出长度最长的单词(不同长度的单词只出现一次)。

输入格式:
输入格式为单行形式,单词之间使用空格分割。

输出格式:
输出格式为长度最长的一个单词。

输入样例:
在这里给出一组输入。例如:

an not need happy suggest

输出样例:
在这里给出相应的输出。例如:

suggest


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

public class Main {
     
	public static void main(String[] args) {
     
		Scanner cin = new Scanner(System.in);
		
		String s = cin.nextLine();
		String []str = s.split(" ");
		
		
		int max = str[0].length();
		String maxs=str[0];
		
		for(String i:str)
		{
     
			if(i.length()>max)
				max=i.length();
			maxs=i;
		}
		
		System.out.println(maxs);
		cin.close();
	}
}

7-3 office文档页码打印 (20分)

在office软件(word,excel)中,有时只需要打印整个文档中的一部分,就需要用户选择需要打印的页码范围。目前输入的页码范围格式定义为:以逗号分割,可以使用-表示连续页码。例如:1,3,5-9,20。表示需要打印的页码为1,3,5,6,7,8,9,20。

本题目要求读入一行字符串,作为需要打印的页码范围。需要注意以下几点:

1、页码范围输入可以不按顺序。例如:5,3,7,9-10,1-2;
2、连续的页码定义也可能不会按照由小到大的顺序输入。例如:1,9,5,20-15,10;
3、输入的页码范围可能会有重复。例如:1,9,15,5-10,12-20;
输入格式:
第一行:表示页码范围的格式化字符串

输出格式:
将需要打印的页码按照由小到大的顺序输出,以空格分割

输入样例:

1,3,5-9,20

输出样例:

1 3 5 6 7 8 9 20

输入样例:

12-20,1,15,9,5-10

输出样例:

1 5 6 7 8 9 10 12 13 14 15 16 17 18 19 20


import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;
public class Main{
     
   public static void main(String[] args) {
     
    Scanner n=new Scanner(System.in);
      String str=n.nextLine();
      String[] st=str.split(",");
      TreeSet t=new TreeSet();
      for(int i=0;i<st.length;i++) 
      {
     
         if(st[i].contains("-")) {
     
        	 String[] f=st[i].split("-");
        	 int x=Integer.parseInt(f[0]);
        	 int d=Integer.parseInt(f[1]);
        	 if(x>d) {
     
        		 	int s=x;
        		 	x=d;
        		 	d=s;
        	 }
	         for(int j=x;j<=d;j++) //展开x到d之间的所有值
	         {
     
	        	 t.add(j);
	         }
         }
         else {
     
    	   t.add(Integer.parseInt(st[i]));
         }
        // System.out.println(t);
      }
      ArrayList m=new ArrayList(t);
      for(int i=0;i<m.size();i++) {
     
    	  if(i==0)
    		  System.out.print(m.get(i));
    	  else
    		  System.out.print(" "+m.get(i));
      }
   }
}

使用集合存储防重复

7-4 sdust-Java-字符串集合求并集 (20分)

从键盘接收N个英文字符串(其中不同的字符串数量大于10),从头开始取5个不同的字符串放入一个集合S1,然后接着取5个不同的字符串放入另一个集合S2,按照字母顺序输出S1和S2的并集中的每个字符串(字符串区分大小写)

输入格式:
一行以空格分开的英文字符串(不同的字符串数量大于10)。

输出格式:
按照字母顺序(先比较字符串首字母,首字母相同的比较字符串第二个字母,以此类推)输出的S1和S2并集的字符串。

输入样例:

android python java javaee javase database java jsp servlet java algorithm junit

输出样例:

algorithm
android
database
java
javaee
javase
jsp
python
servlet

//从键盘接收N个英文字符串(其中不同的字符串数量大于10),从头开始取5个不同的字符串放入一个集合S1,
//然后接着取5个不同的字符串放入另一个集合S2,按照字母顺序输出S1和S2的并集中的每个字符串(字符串区分大小写)
import java.util.*;
public class Main {
     
	public static void main(String args[])
	{
     
		Scanner cin=new Scanner(System.in);
		String s=cin.nextLine();
		
		String []ns=s.split(" ");
		
		Set<String> s1=new TreeSet<String>();//集合s1
		Set<String> s2=new TreeSet<String>();//集合s2
		
		for(int i=0;i<ns.length;i++)
		{
     
			if(s1.size()<5)
			{
     
				s1.add(ns[i]);
				continue;
			}
			if(s2.size()<5)
			{
     
				s2.add(ns[i]);
				continue;
			}
		}
		
		s1.addAll(s2);//s2并入s1
		
		/*for(Object i:s1)
		{
			System.out.println(i);
		}*/
		
		Iterator it=s1.iterator();
		while(it.hasNext())
			System.out.println(it.next());
		
		cin.close();
	}

}

你可能感兴趣的:(JAVA,java)