PTA练习 05集合框架

7-1 jmu-Java-02基本语法-08-ArrayList入门 (10 分)

本习题主要用于练习如何使用ArrayList来替换数组。
新建1个ArrayList<String> strList用来存放字符串,然后进行如下操作。

提示: 查询Jdk文档中的ArrayList。
注意: 请使用System.out.println(strList)输出列表元素。

输入格式

  1. 输入: n个字符串,放入strList。直到输入为!!end!!时,结束输入。

  2. strList头部新增一个begin,尾部新增一个end

  3. 输出列表元素

  4. 输入: 字符串str

  5. 判断strList中有无包含字符串str,如包含输出true,否则输出false。并且输出下标,没包含返回-1。

  6. 在strList中从后往前找。返回其下标,找不到返回-1。

  7. 移除掉第1个(下标为0)元素,并输出。然后输出列表元素。

  8. 输入: 字符串str

  9. 将第2个(下标为1)元素设置为字符串str.

  10. 输出列表元素

  11. 输入: 字符串str

  12. 遍历strList,将字符串中包含str的元素放入另外一个ArrayList strList1,然后输出strList1。

  13. 在strList中使用remove方法,移除第一个和str相等的元素。

  14. 输出strList列表元素。

  15. 使用clear方法,清空strList。然后输出strList的内容,size()isEmpty(),3者之间用,连接。

输入样例:

a1 b1 3b a2 b2 12b c d !!end!!
b1
second
b

输出样例:

[begin, a1, b1, 3b, a2, b2, 12b, c, d, end]
true
2
2
begin
[a1, b1, 3b, a2, b2, 12b, c, d, end]
[a1, second, 3b, a2, b2, 12b, c, d, end]
[3b, b2, 12b]
[a1, second, 3b, a2, b2, 12b, c, d, end]
[],0,true
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        ArrayList<String> strList = new ArrayList<>();
        while(true)
        {
            String s = in.next();
            if("!!end!!".equals(s)) {
                break;
            }
            strList.add(s);
        }
        strList.add(0, "begin");
        strList.add("end");
        System.out.println(strList);
        String str = in.next();
        System.out.println(strList.contains(str));
        System.out.println(strList.indexOf(str));
        System.out.println(strList.lastIndexOf(str));
        System.out.println(strList.get(0));
        strList.remove(0);
        System.out.println(strList);
        str = in.next();
        strList.set(1, str);
        System.out.println(strList);
        str = in.next();
        ArrayList<String> strList1 = new ArrayList<>();
        for(int i=0;i<strList.size();i++)
        {
            if(strList.get(i).contains(str)) {
                strList1.add(strList.get(i));
            }
        }
        System.out.println(strList1);
        strList.remove(str);
        System.out.println(strList);
        strList.clear();
        System.out.println(strList+","+strList.size()+","+strList.isEmpty());
    }
}

 

7-2 jmu-Java&Python-统计一段文字中的单词个数并按单词的字母顺序排序后输出 (10 分)

现需要统计若干段文字(英文)中的不同单词数量。
如果不同的单词数量不超过10个,则将所有单词输出(按字母顺序),否则输出前10个单词。

注1:单词之间以空格(1个或多个空格)为间隔。
注2:忽略空行或者空格行。
注3:单词大小写敏感,即'word'与'WORD'是两个不同的单词 。

输入说明

若干行英文,最后以!!!!!为结束。

输出说明

不同单词数量。 然后输出前10个单词(按字母顺序),如果所有单词不超过10个,则将所有的单词输出。

输入样例

Failure is probably the fortification in your pole
It is like a peek your wallet as the thief when you
are thinking how to spend several hard-won lepta
when you Are wondering whether new money it has laid
background Because of you, then at the heart of the
most lax alert and most low awareness and left it
godsend failed
!!!!!

输出样例

49
Are
Because
Failure
It
a
alert
and
are
as
at

 

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Set<String> words = new TreeSet<>();
		Scanner sc = new Scanner(System.in);
		while(true)
		{
			String ss = sc.next();
			if(ss.equals("!!!!!"))
				break;
			else
				words.add(ss);
		}
		System.out.println(words.size());
		if(words.size() < 10)
		{
			for(String s : words)
				System.out.println(s);
		}
		else
		{
			int count = 0;
			for(String s : words)
			{
				if(count++ > 9)
					break;
				System.out.println(s);
			}
		}
		sc.close();
	}
}

 

7-3 程序填空题4 (5 分)

补全以下程序,使程序能得到与输出样例通样的结果。

import java.util.*;
public class Main {
    public static void main(String[] args) {
    //请在此处添加一行代码
        ts.add("cab");
        ts.add("bac");
        ts.add("bca");
    ts.add("123");
        ts.add("abc");
        ts.add("acb");
        ts.add("cba");
        ts.add("cab");
        //请在此处添加一行代码
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

### 输入格式: 无 ### 输出格式: 多行有序的字符串 ### 输入样例: ```in ``` ### 输出样例: ```out 123 abc acb bac bca cab cba ```
import java.util.*;

public class Main {
    public static void main(String[] args) {
        //请在此处添加一行代码
        TreeSet ts = new TreeSet();
        ts.add("cab");
        ts.add("bac");
        ts.add("bca");
        ts.add("123");
        ts.add("abc");
        ts.add("acb");
        ts.add("cba");
        ts.add("cab");
        //请在此处添加一行代码
        Iterator it = ts.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

 

7-4 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++)
	         {
	        	 t.add(j);
	         }
         }
         else {
    	   t.add(Integer.parseInt(st[i]));
         }
      }
      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-5 学术会议地点统计问题 (10 分)

学术会议地点统计问题

秘书统计张教授【以后简称 z 】和王教授【以后简称 w 】上一年度参加学术会议的情况,教授详细行程清单如下:

z:bj 3,hz 2,qd 4,nj 5,wh 3,bj 3

w:hn 7,xm 6,bj 4,gz 6,wh 4

现在秘书需要完成以下统计工作。 找出两位教授共同去过的城市,并找出住宿天数长的教授,按照如下格式输出:

z:bj 6,w:wh 4

请同学们编写代码帮助搞定。

输入格式:

固定为2行

【数据说明】冒号前面为教授简称,冒号后面为会议详情,分组内使用空格分开,左边为城市地点简称,右边为住宿天数,多个分组之间使用逗号分开【以上字符均为西文】(测试数据经过专门处理,不存在共同去过的城市有相同天数的情况)

输出格式:

固定为1行

由0个或者多个记录组成,记录格式为:

教授简称 冒号 城市简称 空格 天数

多个记录之间使用逗号分开,最后一个记录末尾没有逗号

如果0个记录时,输出 none

【输出顺序说明】输出按照城市地点简称字母升序排序

【输出内容说明】如果没有共同去过的城市,输出为 none 四个字母,两边均无空格

输入样例:

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

z:bj 3,hz 2,qd 4,nj 5,wh 3,bj 3
w:hn 7,xm 6,bj 4,gz 6,wh 4

结尾无空行

输出样例:

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

z:bj 6,w:wh 4

结尾无空行

import java.util.Scanner;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        TreeMap<String, Integer> z = new TreeMap<String, Integer>();
        TreeMap<String, Integer> w = new TreeMap<String, Integer>();
        
        String s = sc.nextLine();
        s = s.substring(2);
        String[] ss = s.split(",");
        for(String i : ss) {
            String[] s2 = i.split(" ");
            if (!z.containsKey(s2[0])) {
                z.put(s2[0], Integer.parseInt(s2[1]));
            } else {
                z.put(s2[0], Integer.parseInt(s2[1]) + z.get(s2[0]));
            }
        }
        
        s = sc.nextLine();
        s = s.substring(2);
        ss = s.split(",");
        for(String i : ss) {
            String[] s2 = i.split(" ");
            if (!w.containsKey(s2[0])) {
                w.put(s2[0], Integer.parseInt(s2[1]));
            } else {
                w.put(s2[0], Integer.parseInt(s2[1]) + w.get(s2[0]));
            }
        }

        int cnt = 0;
        for(String i : z.keySet()){
            if(w.containsKey(i)){
                if(cnt != 0){
                    System.out.print(",");
                }
                cnt++;
                if(z.get(i) > w.get(i)){
                    System.out.print("z:" + i + " " + z.get(i));
                }
                else if(z.get(i) < w.get(i)){
                    System.out.print("w:" + i + " " + w.get(i));
                }
            }
        }
        if(cnt == 0){
            System.out.println("none");
        }
    }
}

 

7-6 单链表基本操作 (5 分)

请编写程序实现单链表插入、删除结点等基本算法。给定一个单链表和一系列插入、删除结点的操作序列,输出实施上述操作后的链表。单链表数据域值为整数。

输入格式:

输入第1行为1个正整数n,表示当前单链表长度;第2行为n个空格间隔的整数,为该链表n个元素的数据域值。第3行为1个正整数m,表示对该链表施加的操作数量;接下来m行,每行表示一个操作,为2个或3个整数,格式为0 k d或1 k。0 k d表示在链表第k个结点后插入一个数据域值为d的结点,若k=0则表示表头插入。1 k表示删除链表中第k个结点,此时k不能为0。注:操作序列中若含有不合法的操作(如在长度为5的链表中删除第8个结点、删除第0个结点等),则忽略该操作。n和m不超过100000。

输出格式:

输出为一行整数,表示实施上述m个操作后的链表,每个整数后一个空格。输入数据保证结果链表不空。

输入样例:

5
1 2 3 4 5
5
0 2 8
0 9 6
0 0 7
1 0 
1 6

输出样例:

7 1 2 8 3 5 
#include<stdio.h>
typedef struct Node
{
    int data;
    struct Node*next;
}node;
node* head=NULL;
node* rear;
void insertend(node* temp)
{
    if(head==NULL)
    {
        head=temp;
        rear=temp;
        rear->next=NULL;
    }
    else
    {
        rear->next=temp;
        rear=temp;
        rear->next=NULL;
    }
}
void insert(node*temp,int k,int d)
{
    if(k==0)
    {
        temp->data=d;
        temp->next=head;
        head=temp;
    }
    else
    {
        node* p0=head;
        while(k-1>0)
        {
            p0=p0->next;
            k--;
        }
        temp->next=p0->next;
        p0->next=temp;
        temp->data=d;
    }
}
void delete(int k)
{
    node* p=head;
    int nm=1;
    while(p!=NULL&&nm<k-1)
    {
        p=p->next;
        nm++;
    }
    node*q=p;p=p->next;
    if(p->next!=NULL)
    {
        q->next=p->next;
        free(p);
    }
    else
    {
        q->next=NULL;
        free(p);
    }
}
int main()
{
    int n,i;
    int num;
    node*p;
    int m;
    scanf("%d",&n);
    for(i=0;i<n;i++) 
    {
        node*n=(node*)malloc(sizeof(struct Node));
        insertend(n);
    }
    p=head; 
    while(p!=NULL)
    {
        scanf("%d",&num);
        p->data=num;
        p=p->next;
    }
    scanf("%d",&m);
    int n1,n2,n3;
    for(i=0;i<m;i++)
    {
    	scanf("%d",&n1);
    	if(n1==0)
		{
			scanf("%d",&n2);
            scanf("%d",&n3);
			if(n2>=0&&n2<=n)
            {
			    node*temp=(node*)malloc(sizeof(struct Node));
			    insert(temp,n2,n3);
			    n++;
            }
		}
		if(n1==1)
		{
			scanf("%d",&n2);
			if(n2>0&&n2<=n)
			{
				delete(n2);
				n--;
			}
		}
	}
	p=head;
	while(p!=NULL)
    {
	    printf("%d ",p->data);
	    p=p->next;
    }
    printf("\n");
    return 0;
}

 

7-7 查询某人 (10 分)

有一个人员数组,要在此数组中查询某个人是否存在,具体要求如下:
1.定义Person类:
a 属性 name和age
b 两个属性的getters 和setters
c 带参数构造方法,为name和age给值 以及无参构造方法,给name赋值为none,age赋值为1
d ToString方法
public String toString() { return "Person [name=" + name + ", age=" + age + "]"; }
2.在main方法中,创建Person数组,数组长度通过键盘输入,数组每一个对象的name和age通过键盘给出,创建数组后,首先显示所有人员的信息,然后输入一个姓名,查询数组中有这个人么?如果有,输出这个人的信息,否则输出not found

输入格式:

请在这里写输入格式。例如:输入在一行中给出2个绝对值不超过1000的整数A和B。

输出格式:

请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。

输入样例:

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

3
tian 3
jerry 23
sun 22
su

结尾无空行

3
may 51
sunny 23
lily 32
lily

结尾无空行

输出样例:

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

Person [name=tian, age=3]
Person [name=jerry, age=23]
Person [name=sun, age=22]
not found

结尾无空行

Person [name=may, age=51]
Person [name=sunny, age=23]
Person [name=lily, age=32]
查询结果:
Person [name=lily, age=32]

结尾无空行

import java.util.Scanner;

class Person {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Person() {
		this.setName("none");
		this.setAge(1);
	}

	public Person(String name, int age) {
		this.setName(name);
		this.setAge(age);
	}

	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		Person[] pp = new Person[n];
		for (int i = 0; i < n; i++) {
			pp[i] = new Person(sc.next(), sc.nextInt());
		}
		String fid = sc.next();
		int flag = 0;
		for (int i = 0; i < n; i++) {
			System.out.println(pp[i].toString());
			if (pp[i].getName().equals(fid) == true) {
				flag = 1;
				System.out.println("查询结果:");
				System.out.println(pp[i].toString());
			}
		}
		if (flag == 0)
			System.out.println("not found");
		sc.close();
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值