4月22日に小米の招聘会の筆記試験を覚えます


今日の夜7時に南園で小米会社が開催した特別招聘会に参加しました.事前に準備ができていなかったので、筆記試験で直接秒殺されました.いくつかの問題はできません.勝手に書きました.以前はjavaというプログラミング言語をよく知っていると思っていた私は、自分が本当に弱いことに気づきました.二轮に入る希望はほとんどなくて、幸运なのは手ぶらで帰ることがなくて、质问のコーナーで私は妻に米の人形を夺って、楽しいです...
本題に戻って、私は自分の記憶でいくつかの印象的なテーマを記録して、自分の後の筆記試験の参考に供します.
質問1:java言語におけるsynchronizedキーワードの使い方、具体的なテーマがはっきり覚えていません.
package test;

public class Test {
	public synchronized void a(){
		System.out.println("a");
	}
	
	public static synchronized void b(){
		System.out.println("b");
	}
	
	public void c(){
		synchronized(this){
			System.out.println("c");
		}	
	}
	
	public synchronized void d(){
		System.out.println("d");
	}

	public static void main(String[] args){
		new Thread(new Runnable(){
			@Override
			public void run() {
				new Test().a();
			}
		}).start();
		
		new Thread(new Runnable(){
			@Override
			public void run() {
				new Test().b();
			}
		}).start();
		
		new Thread(new Runnable(){
			@Override
			public void run() {
				new Test().c();
			}
		}).start();
		
		new Thread(new Runnable(){
			@Override
			public void run() {
				new Test().d();
			}
		}).start();
	}
}
このプログラムは何を出力しますか?
質問2:プログラムがコンパイルできるかどうかを聞いて、もし通過できれば何を出力して、もし通じないならばどうしてですか?
A.java:
public interface A {
	
}

B.java:
public class B {

}

C.java:
public class C extends B implements A{
	
}

Test.java:
public class Test {
	public void print(A a)
	{
		System.out.print("A");
	}
	public void print(B a)
	{
		System.out.print("B");
	}
	public static void main(String[] args){
		new Test().print(new C());
	}
}

質問3:1枚のm*nの碁盤にk個の駒を置くことを要求し、1を要求し、同時に2つの駒が同じ行にあってはならない.2、同時に2つの駒が同じ列にあってはならない.3,同時に2つの駒が同じ対角線の上であってはならなくて、どれだけの種類の配置方法があるかを聞きます.
質問4:1つの数がnの数列を与えて、今その中のk番目の大きい数を取り出す必要があります.時間の複雑さはいくらですか.
質問5:java/c++の伝値参照にはどのような違いがありますか?
答え1:
synchronized問題
まとめ:
1、synchronizedキーワードの役割ドメインは2種類あります:1)あるオブジェクトインスタンス内で、synchronized aMethod(){}は、複数のスレッドがこのオブジェクトに同時にアクセスするsynchronizedメソッドを防止します(1つのオブジェクトに複数のsynchronizedメソッドがある場合、1つのスレッドが1つのsynchronizedメソッドにアクセスしている限り、他のスレッドはこのオブジェクトのいずれかのsynchronizedメソッドに同時にアクセスできません).この場合,異なるオブジェクトインスタンスのsynchronized法は干渉しない.すなわち、他のスレッドは、同じクラスの別のオブジェクトインスタンスのsynchronizedメソッドに同時にアクセスすることができる.2)あるクラスの範囲であり、synchronized static aStaticMethod{}は複数のスレッドがこのクラスのsynchronized staticメソッドに同時にアクセスすることを防止する.クラスのすべてのオブジェクトインスタンスに役立ちます.
2、synchronizedキーワードは、メソッドの前にsynchronizedキーワードを使用する以外に、synchronizedキーワードは、このブロックのリソースに対してのみ反発アクセスを行うことを示すメソッドのブロックにも使用することができる.使用法はsynchronized(this){/*ブロック*/}で、その役割ドメインは現在のオブジェクトです.
3、synchronizedキーワードは継承できません.つまり、ベースクラスのメソッドsynchronized f(){}は、継承クラスで自動的にsynchronized f(){}ではなく、f(){}となります.クラスを継承するには、synchronizedメソッドを明示的に指定する必要があります.
Java言語のキーワードは、メソッドまたはコードブロックを修飾するために使用される場合、同じ時点で最大1つのスレッドだけがセグメントコードを実行することを保証します.
一、2つの同時スレッドが同じオブジェクトobjectのsynchronized(this)同期コードブロックにアクセスすると、1時間に1つのスレッドしか実行できない.別のスレッドは、現在のスレッドがこのコードブロックを実行するまで待たなければなりません.
二、しかしながら、あるスレッドがobjectのsynchronized(this)同期コードブロックにアクセスする場合、別のスレッドは、object内の非synchronized(this)同期コードブロックにアクセスすることができる.
三、特に重要なのは、1つのスレッドがobjectのsynchronized(this)同期コードブロックにアクセスすると、他のスレッドがobject内の他のすべてのsynchronized(this)同期コードブロックへのアクセスがブロックされることである.
四、第三の例は、他の同期コードブロックにも同様に適用される.すなわち、objectのsynchronized(this)同期コードブロックにスレッドがアクセスすると、このobjectのオブジェクトロックが得られる.その結果、objectオブジェクトのすべての同期コード部分への他のスレッドのアクセスが一時的にブロックされる.
五、以上の規則は他の対象ロックに対しても同様に適用する.
プログラムはa,b,c,dを印刷する
 
答え2:
コンパイルエラー、cがどれか認識できません
答えの3:オリジナルは指導を求めます
#include<stdio.h>
#include<math.h>
const int MAX_LENGTH = 1000;
int M,N,K; //            ,M       ,N       ,K      
int methodCount; 
int flag[MAX_LENGTH];//flag[i]   i        flag[i] ,flag[i]=-1        

bool judge(int rowNum,int colNum)
{
	int i;
	bool f = true;
	for(i=0;i<rowNum;i++)
		if(flag[i]==colNum|| (rowNum-i)==abs(colNum-flag[i]))
		{
			f = false;
			break;
		}
	return f;
}

void recursive(int currentRow,int queensLeft)
{
	if(queensLeft==0)
	{
		//               
		methodCount++;
		return;
	}
	else if((M-currentRow)<queensLeft)
		//                          
		return;

	int i;
	
	//            
	for(i=0;i<N;i++)
		if(judge(currentRow,i))
		{
			flag[currentRow]=i;
			recursive(currentRow+1,queensLeft-1);
		}
	
	//      ,      
	flag[currentRow]=-1;
	recursive(currentRow+1,queensLeft);
}

int main()
{
	scanf("%d %d %d",&M,&N,&K);
	methodCount=0;
	if(!(M<K || N<K)) 
		recursive(0,K);
	printf("%d
",methodCount); }

 
答え4:
http://www.cnblogs.com/zhjp11/archive/2010/02/26/1674227.html
未完....答えは続きます...