// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css //目录导航 //生成目录索引列表

PTA实验室五

加粗部分是输入(出)的格式或样例
1.本习题主要用于练习如何使用ArrayList来替换数组。
新建1个ArrayList strList用来存放字符串,然后进行如下操作。

提示: 查询Jdk文档中的ArrayList。
注意: 请使用System.out.println(strList)输出列表元素。
输入格式:
输入: n个字符串,放入strList。直到输入为!!end!!时,结束输入。
在strList头部新增一个begin,尾部新增一个end。
输出列表元素
输入: 字符串str
判断strList中有无包含字符串str,如包含输出true,否则输出false。并且输出下标,没包含返回-1。
在strList中从后往前找。返回其下标,找不到返回-1。
移除掉第1个(下标为0)元素,并输出。然后输出列表元素。
输入: 字符串str
将第2个(下标为1)元素设置为字符串str.
输出列表元素
输入: 字符串str
遍历strList,将字符串中包含str的元素放入另外一个ArrayList strList1,然后输出strList1。
在strList中使用remove方法,移除第一个和str相等的元素。
输出strList列表元素。
使用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.*;
public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        ArrayList< String> strList =new ArrayList<>();
        strList.add("begin");
        while(true) {
            String s=in.next();
            if(s.equals("!!end!!"))
                break;
            strList.add(s);
        }
        strList.add("end");
        System.out.println(strList);
        String l=in.next();
        System.out.println(strList.contains(l));//判断集合里面是否有该字符串
        System.out.println(strList.indexOf(l));//判断该字符串的下标位置
        System.out.println(strList.lastIndexOf(l));//查找最后一个字符串出现的下标的位置,相当于重后往前找
        System.out.println(strList.get(0));//输出第一个集合的字符串
        strList.remove(0);//移除第一个字符串
        System.out.println(strList);
        String j=in.next();
        strList.set(1, j);//把字符串j放到集合的第一个位置
        System.out.println(strList);
        j=in.next();
        ArrayList<String> strList1=new ArrayList<>();
        Iterator<String> it = strList.iterator();
        while(it.hasNext()) {
            String m=it.next();
            int f=m.indexOf(j);
            if(f!=-1) {
                strList1.add(m);
            }
        }
        System.out.println(strList1);
        strList.remove(j);
        System.out.println(strList);
        strList.clear();
        System.out.println(strList+","+strList.size()+","+strList.isEmpty());
    }
}

2.根据教师的花名册,找到出勤最多的人。
输入格式:
出勤记录单行给出,数据直接使用空格分割。
输出格式:
单行输出(若有多人,人名直接使用空格分割,结尾处没有空格)。
输入样例:
zs ls ww ml zs ls ml zs ww
输出样例:
zs
解题代码:

import java.util.*;
import static java.lang.Math.*;

public class Main {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String n= in.nextLine();//注意这里是nextLine,不是next
        String []arr=n.split(" ");//用空格将输入的名字分隔开并存入数组arr中
        ArrayList<String> s=new ArrayList<>();//定义链表,后续将用链表进行去重
        for(int i=0;i< arr.length;i++){
            s.add(arr[i]);//把arr中的元素都加入到s中
        }
        LinkedHashSet<String>list=new LinkedHashSet<>(s);//利用哈希的特性对s进行去重
        ArrayList<String>list1=new ArrayList<>(list);//将去重后的链表重新赋值给一个新的链表list1
        var kind=new int [list1.size()];//准备利用桶排的方式进行计数,kind用于存储去重后的元素,文章最后会附上桶排的c++代码
        var m=new int [list1.size()];//m用于存储去重后的每个元素的个数
        for(int i=0;i< list1.size();i++){
            kind[i]=i;//将kind的第i位和去重后的元素进行一一对应,使得kind[i]表示的就是去重过后的第i个元素
            m[i]=0;//将m整体赋值为0
        }
        for(int j=0;j< list1.size();j++){
            for(int i=0;i< s.size();i++){
                if(list1.get(j).equals(s.get(i))){
                    m[kind[j]]++;//对元素的个数进行统计
                }
            }
        }
        int maxx=0,flag1=0,cnt=0;//用maxx来表示出现次数最大的,flag1用于后面输出的时候控制输出格式,cnt用于计算是否存在多个答案的情况
        for(int i=0;i< list1.size()-1;i++){
            if(m[i]==m[i+1])
                cnt++;
        }
        for(int i=0;i< list1.size();i++){
            maxx=max(maxx,m[i]);
        }
        if(cnt==0){//如果cnt为0,则表示最终的答案只有一个
            for(int j=0;j< list1.size();j++){
                if(m[j]==maxx){//m数组用于存储第i个元素出现次数,maxx是出现的最大次数,若二者相等的将list1里面的第j位元素输出
                    System.out.print(list1.get(j));
                }
            }
        }
        else {
            for(int j=0;j< list1.size();j++){
                if(m[j]==maxx&&flag1==0){
                    System.out.print(list1.get(j));
                    flag1=1;
                    continue;//continue用于防止本次循环还会执行下面的if语句
                }
                if(m[j]==maxx){
                    System.out.print(" "+list1.get(j));
                }
            }
        }
    }
}

这道题有点小难,但是可以锻炼逻辑
3.创建一个倒数计数线程。要求:1.该线程使用实现Runnable接口的写法;2.程序该线程每隔0.5秒打印输出一次倒数数值(数值为上一次数值减1)。
输入格式:
N(键盘输入一个整数)
输出格式:
每隔0.5秒打印输出一次剩余数
输入样例:
6
输出样例:
6
5
4
3
2
1
0

解题代码:

import java.util.*;
import static java.lang.Thread.sleep;
class MyThread implements Runnable{
    Scanner in=new Scanner(System.in);
    int n= in.nextInt();
    @Override
    public void run() {
        for(int i=n;i>=0;i--){
            System.out.println(i);
            try {
                sleep(500);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
public class Main {
    public static void main(String[] args){
        Thread t=new Thread(new MyThread());
        t.start();
    }

}

这个题就是一个简单的创建线程并且进行sleep的一个题
注意:sleep是在try语句中否则会报错,还要注意导入的库
最后附上桶排的c++代码:

#include <iostream>
using namespace std;
void bucketSort(long long arr[], int len) {
	long long max = LLONG_MIN; long long min = LLONG_MAX;//此处为long long范围内的所有数,保证输入的数在范围内LLONG_MIN和LLONG_MAX均为常数
	for (int i = 0; i < len; i++) {
		if (arr[i] > max) max = arr[i];//找到这个数组的最大值,确定数组上限
		if (arr[i] < min) min = arr[i];//找到这个数组的最小值,确定数组下限   此两行用于缩小桶的范围,可以简化计算
	}
	int bucketLen = max - min + 1;//确定桶的真实范围 eg:min=10,max=15;则桶中的数字一共有15-10+1个
	int* bucket = new int[bucketLen];
	for (int i = 0; i < bucketLen; i++) bucket[i] = 0;//将数组全部初始化为0
	int index = 0;
	for (int i = 0; i < len; i++) {
		index = arr[i] - min;//单独计算下标
		bucket[index]++;//统计这个数出现的次数,每出现一次就+1
	}
	int start = 0;//定义下标
	for (int i = 0; i < bucketLen; i++) {
		for (int j = start; j < start + bucket[i]; j++) {
			arr[j] = min + i;
		}
		start += bucket[i];
	}
}

我这个写的不是很好,将就着看一下,也建去搜一下排序。

posted @ 2023-04-12 19:43  xihelhy  阅读(52)  评论(0)    收藏  举报