一. 描述下进程和线程的区别
1.当进程发生调度时,它拥有一个完整地虚拟地址空间,但不同的进程拥有不同的虚拟地址空间;而同一进程内的不同线程共享其所属进程的同一地址空间
2.进程切换时涉及相关资源指针的保存以及地址空间的变化;而同一进程内的各线程共享其所属进程的资源和地址空间,切换时无须保存资源,无地址空间变化,从而减少了操作系统的开销
3.进程的调度与切换由操作系统内核完成,而线程的调度可由操作系统完成,也可由用户完成
4.在多线程操作系统中,线程是系统内的执行实体,而进程不是
二. 12枚硬币中有一枚假币(较轻),请问用天平最少几次得出假币?写出算法。。。
3次
先分2份,一边6个称
选出轻的一边,再分2份,一边3个称
然后选出轻的一边(3个)
在这3个中随便选2个称,相等则第另外一个为假币,不等则轻的那个为假币。
三. 说说反射的几种实现方式
Foo foo=new Foo();
1.Class c1=foo.getClass()
2.Class c2=Foo.class;
3.Class c3=Class.forName("Foo");
四. 单向链表头尾反转
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node*next;
}stud;
void addNode(stud*s,int data){
stud* p=(stud*)malloc(sizeof(stud));
p->data=data;
p->next=NULL;
while(s->next!=NULL){
s=s->next;
}
s->next=p;
}
void printList(stud*s){
stud*p=s->next;
printf("Head->");
while(p!=NULL){
printf("%d->",p->data);
p=p->next;
}
printf("taiL\n");
}
void reverse(stud*s){
stud*p=s->next;
stud*q=NULL;
stud*front=NULL;
while(p!=NULL){
q=p->next;
p->next=front;
front=p;
p=q;
}
s->next=front;
}
int main(){
stud*stu1=(stud*)malloc(sizeof(stud));
stu1->next=NULL;
addNode(stu1,5);
addNode(stu1,4);
addNode(stu1,3);
addNode(stu1,2);
addNode(stu1,1);
printf("---------反转前----------\n");
printList(stu1);
printf("---------反转后----------\n");
reverse(stu1);
printList(stu1);
return 0;
}
运行结果如下
五 .数组array[1…n]由奇数个不重复的整数组成,找出一个数,使比这个数大的数和比这个数小的数的个数相等。。。。描述的不太清楚。。。
5 1 2 6 4 7 3 4就是中位数
在床等。。。有没有好的算法??? 额用的排序。。。。