問題3の場合には(Java実装)
ペンの質問を記録します。
問題のシナリオ:
Nの個人的な円は、パケットの数は、1〜3の報告から、人間の列3は、サイクルが順次最後だけ次の人、キューの中の元の位置を求めている人を知って続けて報告し、最初の人から始めます。キーボードのNからの入力を必要とし、出力は最後に残った人の位置です。
例:
入力:5、出力:4
入力:3、出力:2
ここで私は二つの方法を使用して達成するためのコードであり、1は、スタックを使用することで、バケットソートと同様の方法を使用することです。
図1に示すように、スタックを使用して
インポートjava.util.Scanner;
輸入java.util.Stackを;
パブリック クラスメイン{
静的 int型ループ= 0 。
パブリック 静的 ボイドメイン(文字列[]引数){
長い TIME1 = にSystem.currentTimeMillis();
スキャナスキャナ = 新しいスキャナ(System.in)。
int型のn;
スタック <整数> stack1 = 新しいスタック<> ();
スタック <整数> stack2 = 新しいスタック<> ();
N = scanner.nextInt()。
以下のために(int型 I = N; I> 0; i-- ){
stack1.push(I)。
}
int型の合計= 0 ;
一方、(!stack1.size()= 1 ){
場合(stack2.size()== 0 ){
合計 = stack1.size()。
以下のために(int型、iは<=総; I = 1 iは++ ){
ループ ++ 。
もし(ループ%3 == 0 ){
stack1.pop()。
} 他{
stack2.push(stack1.pop())。
}
}
}
もし(stack1.size()== 0 ){
合計 = stack2.size()。
以下のために(int型、iは<=総; I = 1 iは++ ){
stack1.push(stack2.pop())。
}
}
}
のSystem.out.println(stack1.pop())。
長い TIME2 = にSystem.currentTimeMillis();
System.out.println(TIME2 - 時刻1)。
}
}
2、バケットソートの使用
import java.util.Scanner;
public class To3 {
public static void main(String[] args){
long time1=System.currentTimeMillis();
int[] a;
int n;
Scanner scanner=new Scanner(System.in);
n=scanner.nextInt();
a=new int[n+1];
for(int i=1;i<=n;i++)
a[i]=1;
int i=1,num=0,flag=0;
while(flag!=n-1)
{
if(a[i]==1)
num++;
if(num==3)
{
a[i]=0;
num=0;
flag++;
}
if(i==n)
{
i=0;
}
i++;
}
for(int j=1; j<=n; j++)
{
if(a[j]==1)
System.out.println(j);
}
long time2=System.currentTimeMillis();
System.out.println(time2-time1);
}
}
从所耗时间上来看,第二种方法效率更高,并且在N的大小逐渐增大的情况下,第二种方法的效率会比第一种好很多。
将第二种算法改用C/C++实现的话,应该运行速度还能提升不少,有兴趣的可以尝试一下。
吾生也有涯,而知也无涯。