検索と並べ替えの演習の概要(2)検索と並べ替えの演習の概要
(3)
1.シャオバイが階段を上る(再帰設計)
シャオバイが階段を上る階段はn段ありますシャオバイは一度に1、2、3段上がることができます。シャオバイの種類の数を計算する方法が実装されています階段を完成しました。道は?
import java.util.Scanner;
public class LianXi {
public static int f(int n){
if(n==0)
return 1;
if(n==1)
return 1;
if(n==2)
return 2;
return f(n-1) + f(n-2) + f(n-3);
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
System.out.println(f(n));
}
}
2.配列の最小数を回転させます(二分法を再構築します)
。配列の最初の要素を配列の最後に移動します。これを配列の回転と呼びます。昇順で並べ替えられた配列の回転を入力し、回転された配列の最小要素を出力します。たとえば、配列{3,4,5,1,2}は{1,2,3,4,5}の回転であり、配列の最小値は1です。
import java.util.Scanner;
public class LianXi {
public static int min(int []arr){
int begin = 0;
int end = arr.length - 1;
//考虑没有旋转这种特殊的旋转
if(arr[begin]<arr[end])
return arr[begin];
//begin和end指向相邻元素退出
while(begin+1<end){
int mid = begin + ((end - begin) >> 1);
if(arr[mid]>=arr[begin]){
//左侧有序
begin = mid;
}
else{
//右侧有序
end = mid;
}
}
return arr[end];
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int []arr = new int[N];
for(int i = 0; i<N; i++){
arr[i] = in.nextInt();
}
System.out.println(min(arr));
}
}
3.空の文字列を含む順序付けられた文字列配列を検索します(バイナリ検索)。
いくつかの空の文字列を含むソートされた文字列配列があります。指定された文字列(完全に空ではない)文字列を見つけるメソッドを記述します。
import java.util.Scanner;
public class LianXi {
public static int indexOf(String []s,String key){
int begin = 0;
int end = s.length - 1;
while(begin<=end){
int mid = begin + ((end - begin) >> 1);
while(s[mid].equals("")){
mid ++;
if(mid>end)
return -1;
}
if(s[mid].compareTo(key) > 0){
end = mid - 1;
}
else if(s[mid].compareTo(key) < 0){
begin = mid + 1;
}
else{
return mid;
}
}
return -1;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
String []s = {
"a","","ac","","ad","b","","ba"};
System.out.println("输入需要查找的字符串");
String key = in.next();
int index = indexOf(s,key);
System.out.println(index);
}
}
4.最長の連続増加サブシーケンスを見つける(半順序)
線形テーブルが順番に格納されている場合、線形テーブルで最長の連続増加サブシーケンスを見つけるアルゴリズムを設計してください。たとえば、{1,9,2,5,7,3,4,6,8,0}で最も長く増加するサブシーケンスは{3,4,6,8}です。
import java.util.Scanner;
public class LianXi {
public static void getMaxLen(int[]arr){
int begin = 0;
int a = 1;
int maxlen = 1;
for(int end = 1; end<arr.length; end++){
if(arr[end-1]<arr[end]){
a++;
}
else{
a = 1;
}
if(a>=maxlen){
maxlen = a;
begin = end - maxlen + 1;
}
}
for(int i = begin; i<begin+maxlen;i++){
System.out.print(arr[i] + " ");
}
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int []arr = new int[N];
for(int i = 0; i<N; i++){
arr[i] = in.nextInt();
}
getMaxLen(arr);
}
}