2023/3/28总结

题解

Problem - A - Codeforces

1.这一题没有规律,我们只需要每次都去变量a数组和b数组当前的下标是否小于,自己的数组最后一个值,或者说小于对方数组的最后一个值即可。

#include
#define N 110
int a[N],b[N];
int main()
{
	int n,i,t,j,max1,max2;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(i=0;i=n) puts("Yes");
	}
}

atc

B - Bombs (atcoder.jp)

 1.这一题刚开始用的是dfs后面才发觉有错,需要用bfs()

2.如果遇到的不是#号入队不管即可,如果是则变成"."

代码如下:

#include
#define N 25
int n,m,num;
char str[N][N];
int next[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int book[N][N];
struct node
{
	int x,y,s;
}que[N*100];
int head,tail;
int init()
{
	int i,j;
	for(i=0;inum) return 0;
		for(i=0;i<4;i++)
		{
			tx=que[head].x+next[i][0];
			ty=que[head].y+next[i][1];
			if(tx<0||ty<0||tx>=n||ty>=m) continue;
			if(book[tx][ty]) continue;
			if(str[tx][ty]=='#')
			{
				str[tx][ty]='.';
			}
			book[tx][ty]=1;
			que[tail].x=tx;
			que[tail].y=ty;
			que[tail].s=nowdis;
			tail++;
		}
		head++;
	}
	return 0;
}
int main()
{
	int i,j;
	scanf("%d%d",&n,&m);
	for(i=0;i='0'&&str[i][j]<='9')
			{
				init();
				num=str[i][j]-'0';
				bfs(i,j);
			}
		}
	}
	for(i=0;i

 C - Socks (atcoder.jp)

1.这一题标记即可,用C++的set容器便可以解决此题,如果已经出现了,我们就清除该值,如果没有则加入,计算即可

代码如下:

#include
#define N 500010
#include

using namespace std;

set  nox;
int a[N];
int main()
{
	int n;
	int i,sum=0;
	scanf("%d",&n);
	for(i=0;i

 D - Three Days Ago (atcoder.jp)

 1.这一题用的是状压加上亦或。

2.因为只有10种可能,我们只需要用到10位,就可以表示当前的数字,如果是2 则是0000000100刚开始的结果是00000 00000 我们去亦或得到一个值,存入数组中,如果我们亦或的过程中出现了和前面结果一样的值,说明这个情况到前面出现的那个情况是可以构成题目所要求的,因为亦或相同为0,不同为1,说明至少出现了2次,才能使他们相同。

代码如下:

#include
#define N 500010
#include

using namespace std;

set  nox;
int a[N];
int main()
{
	int n;
	int i,sum=0;
	scanf("%d",&n);
	for(i=0;i

java知识点:

String

String类是不可变类,一旦被创建,这个字符序列就不可以更改。

StringBuffer创建的对象字符序列是可以改变的,通过StringBuffer提供的一些方法就可以改变。

StringBuilder也可以改变字符对象。

StringBuffer是线程安全的。而StringBuilder是线程不安全的。

Math

Math类只是一个工具类,不能创建Math类的对象,只可以直接调用。

Random类

Random类用来专门生成一个随机数,有俩个构造器,一个是默认的以时间为种子,另外一个需要传递一个long类整数的种子。

ThreadLocalRandom是Random的增强版,在并发访问的情况ThreadLocalRandom可以减少多线程竞争资源,保证线程安全性。

集合

2023/3/28总结_第1张图片

主要是由map和collection构成。

set集合,不允许有重复的集合,因此他的值只要俩个0,1.

HashSet,通过键值映射。

LinkedHashSet 内部实现是链表。

TreeSet是SortedSet接口的实现类,它的hash值是一直保持排序状态的。

排序有俩种:自然排序和定制排序,定制排序需要通过Comparator接口的帮助,重写compare方法。

Enunset是为枚举类设计的集合类,所有元素必须是指定枚举类型的枚举值。它不允许加入null元素。

List集合,是一个元素有序、可以重复的集合。

ArrayList和Vector都是基于数组实现的List类,但是ArrayList是线程不安全的,而Vector是线程安全的。

Queue集合是一种模拟队列的数据结构。

PriorityQueue是一个标准的队列实现。是一个排升序的队列。可以重写compare方法去更改比较。

Deque接口是双端队列。

LinkedList是一个基于链表的集合。

Map集合保存具有映射关系的数据。

HashMap和Hashtable都是Map接口的实现类,Hash table是线程安全的,HashMap不是线程安全的。

LinkedHashMao是基于链表实现的hash。

SortedMap和TreeMap,都是保持排序状态的。

WeakHashMap是弱引用,如果WeakHashMap的key所引用的对象被其他强引用变量引用,则key值就会被回收。

IdentityHashMap,和HashMap类似,不一样的是它在处理俩个相等的key值,必须是严格相等,而HashMap只要是equal方法相等就行。

EunmMap是严格与枚举类一起使用的Map,它的key值必须都是枚举类。

泛型

泛型能使参数多样化,不必写多个构造器,或者方法、接口。

静态方法、静态初始化不能使用泛型,因为静态时共享值的,不一样会导致出错。

为了表示各种泛型的父类,可以使用通配符,类型通配符是一个问号?

如果我们写?时想只代表时某一个泛型的父类时,我们可以写< ? extends 父类>上限是Object类

下限是super表示是,最上面的那个父类是哪一种。

泛型方法指的是在声明方法时定义应该或者多个泛型形参。

修饰符 < , >返回值类型 方法名称(形参列表)

{

}

泛型方法比普通方法的方法标签多了泛型形参声明,用尖括号括起来,多个泛型形参之间以逗号隔开,泛型形参声明放在方法修饰符和方法返回值类型之间。

接口、类中定义的泛型不同的是,方法声明中定义的泛型只能在该方法里面使用,接口、类声明中定义的泛型可以在整个接口、类使用。

一旦定义了泛型构造器,在使用构造器时,java会推断泛型形参的类型。

只能声明List形式的数组,不能创建ArrayList[10]这样的数组对象

多线程

并发:在同一时期,有多个指令在单个CPU上交替运行。

并行 : 在同一时期,有多个指令在多个CPU上同时执行。

Thread类

代表线程,所有的线程对象必须时Thread类或者其子类的实例,每个线程的作用时完成一定的任务。

主线程的线程执行体不是由run()方法确定的,而是由main()方法的方法体确定代表主线程的线程执行体。main()方法的方法体就是主线程的线程执行体。

Thread.currentThread(),是Thread类的静态方法,该方法总是返回当前正在之下的线程对象。

getName()该方法时Thread类的实例方法,返回该方法的线程名字。

程序通过setName()方法为线程设置名字

多线程实现方式:

1.继承Thread类的方式进行实现,需要重写run方法,开启线程需要使用start()方法而不是run方法。

2. 实现runable接口,自己定义一个实现runable类,重写run方法,调用所新建的类,去创建对象,然后调用start()方法

3.利用Callable接口和Future接口方式实现。自己创建一个类实现callable接口,重写call,创建自己所之前实现callable接口的类的对象,表示多线程需要执行的任务。创建Future对象,创建Thread类的对象,并且启动。(可以得到线程的返回值)

callable接口定义的方法有返回值,可以声明抛出异常。线程类只是实现了Runnable、Callable接口的,还可以继承其他类。

阻塞

线程调用sleep()方法主动放弃所占用的处理器资源。

线程调用了一个阻塞式IO方法,在该方法返回之前,该线程被阻塞。

线程试图获得一个同步监视器,但是该同步监视器正在被其他线程所持有。

线程在等待某一个通知。

解除阻塞

调用sleep方法的线程经过了指定时间

线程调用的阻塞式IO方法已经返回

线程成功的获得了试图取得的同步监视器

线程正在等待某个通知时,其他线程发出了一个通知。

2023/3/28总结_第2张图片

线程死亡

run()方法结束或者call()方法完成

线程抛出一个未捕获的Exception或者Error

直接调用该线程的stop()方法结束该线程

一旦子线程启动起来之后,它就拥有和主线程相同的地位,不会受主线程的影响。

jion()

join()方法,当某个程序执行流中调用其他线程的join()方法时,调用线程将被阻塞,指定被join()方法加入的join()线程执行完。

join()无参时代表等待线程执行完毕,有一个参数代表等待多长时间,单位为毫秒。

后台线程,又称为守护线程和精灵线程。

如果前台线程全部死亡,后台线程会自动死亡。

使用setDaemon(true)方法指定线程为后台线程

调用sleep()方法让当前线程等待一段时间,并且进行阻塞状态,有一个参数是时间,单位为毫秒。

sleep()方法和yield()方法

sleep()方法暂停当前线程之后,会给其他线程执行机会,不理会优先级,yield()方法只会给优先级相同,或者优先级更高的线程执行机会。

sleep()方法会将线程转入阻塞状态,直到阻塞时间超出,进入就绪状态,而yield()不会进入阻塞状态,而是强制当前线程进入就绪状态。

sleep()方法声明抛出了InterruException异常,而yield()方法并没有

改变优先级

setPriority(),里面有一个参数,表示优先级的高低,10是最大,5的main线程的执行优先级处于普通,1是最小

可以用以下英文代表

MAX_PRIORITY   10

MIN_PRIORITY  1

NORM_PRIORITY  5

同步代码块

代码如下

synchronized(obj)

{



}

obj是同步监视器,上面代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。

任何时间都只能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成之后,该线程会释放对该同步监视器的锁定

synchronized关键字可以修饰方法、可以修饰代码块不能修饰构造器、成员变量。

同步锁

Lock是控制多个线程对共享资源进行访问的工具,每次只能有一个Lock对象加锁,线程开始访问共享资源之前一个获得Lock对象。

死锁:当俩个线程互相等待对方释放同步监视器时就会发生死锁。

对于synchronized修饰的同步方法,必须使用以下三个方法:

wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或者notifyAll()方法来唤醒该线程。

notify()唤醒在此同步监视器上等待的线程,随机唤醒。

notify All()唤醒所有的线程

若使用Lock对象来保证同步

和Lock对象组合使用的是

await()与上面wait()一致

signal()与上面notify()一致

signalAll()与上面notifyAll()一致

阻塞队列:

BlockingQueue接口,当生产者试图向BlockingQueue中放入元素时,如果队列已经满了,那么该线程被阻塞,当消费者线程试图从BlockingQueue中取出元素时,如果该队列已经是空,则该线程被阻塞。

put()  offer() add() 在队列尾部插入元素

take()  remove()  poll()在队头删除元素

element()  peek()在头部取出元素。

Thread类提供了如下几个构造器来设置新创建的线程属于哪一个线程组

Thread(Thread Group group,Runnable target)以target的run()方法作为线程执行体创建新线程,属于group线程组。

Thread(Thread Group group, Runnable target, String name)以target的run()方法作为线程执行体创建新线程。线程名字为name

Thread(Thread Group group, String name)创建新线程,名字为name,属于group线程组

activeCount()返回此线程组中活动线程的数目

interrupt()中断此线程组中的所有线程

isDaemon()判断该线程组是否是后台线程

线程池

newCachelThreadPool()创建一个具有缓存功能的线程池

newFixedThreadPoll()创建一个可重复用的、具有固定线程数的线程池

newScheduledThreePool()创建具有指定线程数的线程池,它可以延迟后执行线程任务。

若要包装线程不安全的集合,可以在集合类型后面加上synchronized接集合类型即可。

例如:

Collection synchronizedCollection(参数)

你可能感兴趣的:(java,数据结构,开发语言)