1、java中的wait()方法和sleep()方法的区别是什么?
sleep()是让某个线程暂停运行一段时间,其控制范围是由当前线程决定,也就是说,在线程里面决定.好比如说,我要做的事情是 "点火->烧水->煮面",而当我点完火之后我不立即烧水,我要休息一段时间再烧.对于运行的主动权是由我的流程来控制.
而wait(),首先,这是由某个确定的对象来调用的,将这个对象理解成一个传话的人,当这个人在某个线程里面说"暂停!",也是 thisOBJ.wait(),这里的暂停是阻塞,还是"点火->烧水->煮饭",thisOBJ就好比一个监督我的人站在我旁边,本来该线程应该执行1后执行2,再执行3,而在2处被那个对象喊暂停,那么我就会一直等在这里而不执行3,但正个流程并没有结束,我一直想去煮饭,但还没被允许, 直到那个对象在某个地方说"通知暂停的线程启动!",也就是thisOBJ.notify()的时候,那么我就可以煮饭了,这个被暂停的线程就会从暂停处继续执行.
其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题。
在java.lang.Thread类中,提供了sleep(),而java.lang.Object类中提供了wait(), notify()和notifyAll()方法来操作线程sleep()可以将一个线程睡眠,参数可以指定一个时间。而wait()可以将一个线程挂起,直到超时或者该线程被唤醒。 wait有两种形式wait()和wait(milliseconds).
sleep和wait的区别有:
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify(
//或者wait()
}
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
2、写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。
分析:本题的初衷是要你找出一个二叉树的最大值和最小值,并没有说让你建立一个二叉树,因为一旦知道二叉树树是怎么建立的,那么就可以直接通过遍历找到最大值和最小值,所以我们需要做的就是建立一个函数,以二叉树的根节点为参数,通过这个函数找到二叉树的最大值和最小值的差值,另外强调效率,选择使用一次遍历就找到最大值和最小值。。
首先建立一个二叉树节点结构体。
typedef struct NodeT
{
int value;
struct NodeT *left,*right;
}NodeT,*treeT;//*treeT表示该结构体的指针类型
然后通过递归来找到最大和最小值,具体实现代码如下:
#include <iostream>
using namespace std;
typedef struct NodeT
{
int value;
struct NodeT *left,*right;
}NodeT,*treeT;//*treeT表示该结构体的指针类型
void GetMaxMin(treeT t,int* max,int*min)//注意函数传入的一定是max和min的指针,如果传入的是这两个值的拷贝,将无法改变这两个值。
{
if (t==NULL) return;
int tmp=t->value;
if (tmp>*max) *max=tmp;
else if (tmp<*min) *min=tmp;
GetMaxMin(t->right,max,min);
GetMaxMin(t->left,max,min);
}
int GetValue(treeT t)
{
int max,min;
max=min=t->value;
GetMaxMin(t,&max,&min);
return max-min;
}
void InsertNode(treeT *ptr,int k)
{
treeT t;
t=*ptr;
if (t==NULL)
{
t=(treeT)malloc(sizeof(NodeT));
t->value=k;
t->left=NULL;
t->right=NULL;
*ptr=t;
return;
}
if (k==t->value)return;
else if(k<t->value) InsertNode(&t->left,k);
else InsertNode(&t->right,k);
}
int main()
{
int b[10]={62,88,58,10,35,73,51,199,40,93};
treeT t=NULL;
for (int j=0;j<10;j++)
InsertNode(&t,b[j]);
cout<<GetValue(t)<<endl;
return 0;
}
3、给定一个query和一个text,均由小写字母组成。要求在text中找出以同样的顺序连续出现在query中的最长连续字母序列的长度。例如, query为“acbac”,text为“acaccbabb”,那么text中的“cba”为最长的连续出现在query中的字母序列,因此,返回结果应该为其长度3。请注意程序效率。
分析:用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置.
当字符匹配的时候,不是简单的给相应元素赋上1,而是赋上其左上角元素的值加1。我们用两个标记变量来标记矩阵中值最大的元素的位置,在矩阵生成的过程中来判断当前生成的元素的值是不是最大的,据此来改变标记变量的值,那么到矩阵完成的时候,最长匹配子串的位置和长度就已经出来了。
实例如下:
a c b a c
a 1 0 0 1 0
c 0 2 0 0 2
a 1 0 0 1 0
c 0 2 0 0 2
c 0 1 0 0 1
b 0 0 2 0 0
a 1 0 0 3 0
b 0 0 1 0 0
b 0 0 1 0 0
(红色为最长公共子串)
具体实现代码:#include <iostream>
#include<string>
using namespace std;
int fstr(string ,string);
int main()
{
string str1,str2;
cout<<"请输入query:";
cin>>str1;
cout<<"请输入text:";
cin>>str2;
cout<<fstr(str1,str2);
return 0;
}
int fstr(string query ,string text)
{
int m=query.size();
int n=text.size();
int *c=new int[n];
int len=0;
for (int i=0;i<m;i++)
{
//为了保留之前的数据,这里的列数必须反过来统计,不然会把之前记录的冲掉
for (int j=n-1;j>=0;j--)
{
if (query[i]==text[j])
{
if (i==0||j==0)
{
c[j]=1;
}
else
c[j]=c[j-1]+1;
}
else
{
c[j]=0;
}
if(c[j]>len)
{
len=c[j];
}
}
}
delete []c;
return len;
}
本题的初衷是要求找出二叉树中的最大值和最小值,
这个二叉
树是已经给定的,不需要你再创建一棵二叉树(创建完二叉树时,已
经能够知道最大值和最小值,再创建就没有意义了)
,所以只需要提
供一个函数,
函数的传入值为二叉树的根,
返回值为最大值最小值差
值的绝对值,强调程序的效率。
思路:
既然是查找最大值和最小值,
而且不知道二叉树是何种类型的,
所以肯定需要遍历,
首先我们能想到的是通过两次遍历分别找到最大
值和最小值,
题目强调程序的效率,
所以这种实现肯定不是出题者希
望得到的答案,所以我们考虑用一次遍历来找到最大值和最小值。