一、PTA
1.1综合小测验
对于控制台输入的处理,nextLine()方法与其他nextXXX方法混用会产生吞回车问题。建议全部使用Scanner.nextLine()
处理输入以免碰到行尾回车换行问题。(相当于C语言的getline)
对于这个问题在PTA里身份证排序的那题需要统一用Scanner.nextLine(),否则会读入数据出错。
本节课堂知识点 |
Eclipse自动生成快捷键解 |
使用Eclipse快速创建程序框架(利用Eclipse的quick fix功能快速创建方法)。 |
不要重复创建Scanner对象。 |
缩进, Tab、Shift+Tab |
运行, ctrl+F11 |
如果JDK为1.6版本(最新版PTA已支持1.8),switch不支持字符串。需先将字将String转化为int(早期的PTA 中使用的open jdk6) |
使用Eclipse的 |
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int[] nums;
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
while(sc.hasNext())
{
String choice=sc.next();
switch(choice)
{
case "fib":
fib(sc);
break;
case "sort":
sort(sc);
break;
case "search":
search(sc);
break;
case "getBirthDate":
getBirthDate(sc);
break;
default:
System.out.println("exit");
break;
}
}
sc.close();
}
private static void search(Scanner sc) {
int x=sc.nextInt();
int i=Arrays.binarySearch(nums, x);
if(i<0) {
System.out.println("-1");
}
else
{
System.out.println(i);
}
}
private static void getBirthDate(Scanner sc) {
int n=sc.nextInt();
String id=sc.nextLine();
System.out.println(id.substring(6, 10)+"-"+id.substring(10, 12)+"-"+id.substring(12, 14));
}
private static void sort(Scanner sc) {
String line=sc.nextLine();
String[] numStrs = line.split(" ");
nums = new int [numStrs.length];
for (int i = 0; i < nums.length; i++) {
nums[i]=Integer.parseInt(numStrs[i]);
}
System.out.println(Arrays.toString(nums));
}
private static void fib(Scanner sc) {
int n=sc.nextInt();
if(n==1)
{
System.out.println("1");
return;
}
else if(n==2)
{
System.out.println("1 1");
return;
}
int []num=new int[n];
num[0]=1;
num[1]=1;
System.out.print("1 1");
for(int i=2;i<num.length;i++)
{
num[i]=num[i-1]+num[i-2];
System.out.println(" "+num[i]);
}
System.out.println();
}
}
1.2身份证排序
主要讲:sort1可直接使用Arrays.sort
,String的subString。
nextInt()与nextLine()混用可能产生的后果:
nextLine()会把nextInt(),next(),nextDouble(),nextFloat()的结束换行符作为字符串读入,进而不需要从键盘输入字符串nextLine便已经转向了下一条语句执行
解决方法:
在每一个nextInt(),next(),nextDouble(),nextFloat()后都加一个nextLine()语句,将它们的结束换行符过滤
本题主要代码
//sort1
for(int i=0;i<n;i++)//抽出出生年月日
{
birth[i]=ids[i].substring(6, 10)+"-"+ids[i].substring(10, 12)+"-"+ids[i].substring(12, 14);
}
Arrays.sort(birth);//排序
for(int i=0;i<n;i++)
{
System.out.println(birth[i]);
}
//sort2
for(int i=0;i<n;i++)
{
birth[i]=ids[i].substring(6, 14);
}
Arrays.sort(birth);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(ids[j].contains(birth[i]))
{
System.out.println(ids[j]);
break;
}
}
}
1.3StringBuilder
主要代码
while(sc.hasNextInt())
{
int n,begin,end;
n=sc.nextInt();
begin=sc.nextInt();
end=sc.nextInt();
StringBuilder str=new StringBuilder("");//构造一个不带任何字符的字符串生成器
for (int i=0; i<n;i++) {
str.append(i);//将 int 参数的字符串表示形式追加到此序列。
}
System.out.println(str.substring(begin, end));//返回一个新的 String,它包含此序列当前所包含字符的子序列
}
2.4动态数组
好处:
动态的增加和减少元素
实现了ICollection和IList接口
灵活的设置数组的大小
代码
import java.util.Scanner;
import java.util.Arrays;
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
while(sc.hasNext())
{
int x=sc.nextInt();
String[][] str= new String[x][];
for(int i=0;i<x;i++)
{
str[i]=new String[i+1];
for(int j=0;j<=i;j++)
{
str[i][j]=(i+1)+"*"+(j+1)+"="+(i+1)*(j+1);
if(j<i)
{
System.out.printf("%-7s",str[i][j]);
}
else if(i==j)
System.out.printf("%s",str[i][j]);
}
System.out.println();
}
System.out.println(Arrays.deepToString(str));
}
}
}
2.5ArrayList入门
常用方法:
方法名 | 解释 |
public void trimToSize() | 将此 ArrayList 实例的容量调整为列表的当前大小 |
public void ensureCapacity(int minCapacity) | 如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。 |
public int size() | 返回此列表中的元素数。 |
public boolean isEmpty() | 如果此列表中没有元素,则返回 true |
public boolean contains(Object o) | 如果此列表中包含指定的元素,则返回 true |
public int indexOf(Object o) | 返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1 |
public int lastIndexOf(Object o) | 返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1 |
public Object clone() | 返回此 ArrayList 实例的浅表副本 |
public Object[] toArray() | 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。 |
public <T> T[] toArray(T[] a) | 按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。如果指定的数组能容纳列表,则将该列表返回此处。否则,将分配一个具有指定数组的运行时类型和此列表大小的新数组。 |
public E get(int index) | 返回此列表中指定位置上的元素。 |
public E set(int index, E element) | 用指定的元素替代此列表中指定位置上的元素。 |
public boolean add(E e) | 将指定的元素添加到此列表的尾部。 |
public void add(int index, E element) | 将指定的元素插入此列表中的指定位置 |
public E remove(int index) | 移除此列表中指定位置上的元素。 |
public boolean remove(Object o) | 移除此列表中首次出现的指定元素(如果存在)。 |
public void clear() | 移除此列表中的所有元素 |
public boolean addAll(Collection<? extends E> c) | 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。 |
public boolean addAll(int index, Collection<? extends E> c) | 从指定的位置开始,将指定 collection 中的所有元素插入到此列表中 |
protected void removeRange(int fromIndex, int toIndex) | 除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素 |
代码:
import java.util.Scanner;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
List<String> strList=new ArrayList<>();
Scanner sc =new Scanner(System.in);
while(sc.hasNext())
{
String str =sc.next();
if(!"!!end!!".equals(str))
{
strList.add(str);
}
if(str.equals("!!end!!"))
{
break;
}
}
strList.add(0, "begin");
strList.add("end");
System.out.println(strList);
String s=new String();
s=sc.next();
System.out.println(strList.contains(s));
System.out.println(strList.indexOf(s));
System.out.println(strList.lastIndexOf(s));
System.out.println(strList.get(0));
strList.remove(0);
System.out.println(strList);
s=sc.next();
strList.set(1, s);
System.out.println(strList);
s=sc.next();
sc.close();
List<String> strList1=new ArrayList<>();
for (int i=0; i<strList.size();i++) {
if(strList.get(i).contains(s))
{
strList1.add(strList.get(i));
}
if(strList.equals(s))
{
strList.remove(s);
break;
}
}
System.out.println(strList1);
System.out.println(strList);
strList.clear();
System.out.println(strList+","+strList.size()+","+strList.isEmpty());
}
}
1.5浮点数的精确运算
主要代码
while(sc.hasNext())
{
String x1,x2;
x1=sc.next();
x2=sc.next();
BigDecimal x11=new BigDecimal(x1);
BigDecimal x22=new BigDecimal(x2);
System.out.println(x11.add(x22));
System.out.println(x11.multiply(x22));
}