「算法」斐波那契數 & 反轉字符串

00509 斐波那契數

題目描述

斐波那契數,一般用 F(n) 表示,造成的序列稱爲斐波那契數列。該數列由 0 和 1 開始,後面的每一項數字都是前面兩項數字的和。也就是:java

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.

給定 N,計算 F(N)。算法

示例 1:數組

輸入:2
輸出:1

解釋:F(2) = F(1) + F(0) = 1 + 0 = 1.bash

示例 2:微信

輸入:3
輸出:2

解釋:F(3) = F(2) + F(1) = 1 + 1 = 2.函數

示例 3:ui

輸入:4
輸出:3

解釋:F(4) = F(3) + F(2) = 2 + 1 = 3.
 spa

提示:code

  • 0 ≤ N ≤ 30

力扣地址

<!-- more -->遞歸

解題報告

本題解由微信公衆號 小猿刷題提供, 錯誤之處, 歡迎指正.

基於遞歸實現

/**
 *  微信公衆號"小猿刷題"
 */
public int fib(int N) {
    if(N == 0){
        return 0;
    }
    if(N == 1){
        return 1;
    }
    return fib(N-2) + fib(N-1);
}

基於數組實現

/**
 *  微信公衆號"小猿刷題"
 */
public int fib(int N) {
    if(N == 0){
        return 0;
    }
    if(N == 1){
        return 1;
    }
    int [] arr = new int[N+1];
    arr[0] = 0;
    arr[1] = 1;
    for(int i = 2; i <= N; i++){
        arr[i] = arr[i-2] + arr[i-1];
    }
    return arr[N];
}

基於交換實現

/**
 *  微信公衆號"小猿刷題"
 */
public int fib(int N) {
    if(N == 0){
        return 0;
    }
    if(N == 1){
        return 1;
    }
    int a = 0;
    int b = 1;
    for(int i = 2; i <= N; i++){
        int sum = a + b;
        a = b;
        b = sum;
    }
    return b;
}
00344 反轉字符串

題目描述

編寫一個函數,其做用是將輸入的字符串反轉過來。輸入字符串以字符數組 char[] 的形式給出。

不要給另外的數組分配額外的空間,你必須原地修改輸入數組、使用 O(1) 的額外空間解決這一問題。

你能夠假設數組中的全部字符都是 ASCII 碼錶中的可打印字符。

示例 1:

輸入:["h","e","l","l","o"]
輸出:["o","l","l","e","h"]

示例 2:

輸入:["H","a","n","n","a","h"]
輸出:["h","a","n","n","a","H"]

力扣地址

解題報告

本題解由微信公衆號 小猿刷題提供, 錯誤之處, 歡迎指正.

經過異或實現

經過異或交換字符串的高低位

/**
 *  微信公衆號"小猿刷題"
 */
public static String reverse(String source){
   char[] chars = source.toCharArray();
   int low = 0;
   int top = chars.length - 1;
   while (low < top){
       chars[low] ^= chars[top];
       chars[top] ^= chars[low];
       chars[low] ^= chars[top];
       low++;
       top--;
   }
   return new String(chars);
}

使用charAt實現

將目標字符串從第一個字符到最後一個字符逆向追加

/**
 *  微信公衆號"小猿刷題"
 */
public static String reverse(String source) {
   int length = source.length();
   String reverse = "";
   for (int i = 0; i < length; i++) {
       reverse = source.charAt(i) + reverse;
   }
   return reverse;
}

使用StringBuffer或者StringBuilder實現

利用java集合內置算法翻轉

/**
 *  微信公衆號"小猿刷題"
 */
public static String reverse(String source) {
   return new StringBuffer(source).reverse().toString();
}

或者

/**
 *  微信公衆號"小猿刷題"
 */
public static String reverse(String source) {
   return new StringBuilder(source).reverse().toString();
}

經過棧實現

利用棧先進後出的特色進行翻轉

/**
 *  微信公衆號"小猿刷題"
 */
public static String reverse(String source) {
   char[] chars = source.toCharArray();
   Stack<Character> stack = new Stack<Character>();
   for (char ch : chars) {
       stack.push(ch);
   }
   String target = "";
   while (!stack.isEmpty()) {
       target += stack.pop();
   }
   return target;
}

使用遞歸實現

使用遞歸進行左右交換

/**
 *  微信公衆號"小猿刷題"
 */
public static String reverse(String source) {
   int length = source.length();
   if (length <= 1) {
       return source;
   }
   String left = source.substring(0, length / 2);
   String right = source.substring(length / 2, length);
   return reverse(right) + reverse(left);
}

使用二分法

/**
 *  微信公衆號"小猿刷題"
 */
public static String reverse(String source) {
   char[] s = source.toCharArray();
   int n = s.length - 1;
   int half = n / 2;
   for (int i = 0; i <= half; i++) {
       char temp = s[i];
       s[i] = s[n - i];
       s[n - i] = temp;
   }
   return new String(s);
}

使用for循環

/**
 *  微信公衆號"小猿刷題"
 */
public static String reverse(String source) {
   char[] array = source.toCharArray();
   String reverse = "";
   for (int i = array.length - 1; i >= 0; i--)
       reverse += array[i];

   return reverse;
}

小猿刷題

相關文章
相關標籤/搜索