PTA实验室五
加粗部分是输入(出)的格式或样例
1.本习题主要用于练习如何使用ArrayList来替换数组。
新建1个ArrayList
提示: 查询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];
}
}
我这个写的不是很好,将就着看一下,也建去搜一下排序。

浙公网安备 33010602011771号