劍指offer

題目描述

計算字符串最後一個單詞的長度,單詞以空格隔開。

分析:從字符串最後一個字母開始算,直到讀入遇到空格返回單詞的長度。

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int count = 0;
    string str;
    getline(cin,str);
    for (int i = str.length()-1; i >=0;i--)
        if (str[i] != ' ')
            count++;
        else
            break;
    cout << count;
}

題目描述

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

分析:二維數組每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。所以每次判斷只要判斷右上角的元素是否和我們要找的元素相等,如果相等就返回1,否則如果右上角元素小於目標元素,那麼行數就加一,如果大於目標元素,就讓列數減一,直到找到元素爲止。

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int row_len = array.size();
        int column_len = array[0].size();//列的長度4
        int row;
        int column;
        for (row = 0, column = column_len - 1;column >= 0 && row < row_len;)
        {
            if (target == array[row][column]) {
                return true;
            }
            if (array[row][column] > target) {
                column--;
                continue;
            }
            if (array[row][column] < target) {
                row++;
                continue;
            }
        }
 
        return false;
    }
};

題目描述

請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串爲We Are Happy.則經過替換之後的字符串爲We%20Are%20Happy。

分析:對於這個題,我的思路是重新開闢一個數組,然後依次遍歷目標字符串中的每個元素,遇到空格,就把空格轉換成“%20”,然後重新複製回原數組即可。

class Solution {
public:
    void replaceSpace(char *str, int length) {
    int i = 0;
    int j = 0;
        char c[100];
    while (str[i] != '\0')
    {
        if (str[i] != ' ')
            c[j++] = str[i++];
        else
        {
            c[j++] = '%';
            c[j++] = '2';
            c[j++] = '0';
            i++;
        }
    }
    i = 0;
    while (i <j)
    {
        str[i] = c[i];
        i++;
    }
    str[j] = '\0';
}
};

當然如果這個題目用java實現的話更加簡單,不過我沒有用java來做這個題,所以就分享給大家一片博客。

https://blog.csdn.net/mr_leehy/article/details/77149933

題目描述

輸入一個鏈表,按鏈表值從尾到頭的順序返回一個ArrayList。

分析:這道題我藉助了棧,應爲棧是先進後出,剛好符合我們的要求,之間遍歷鏈表,把每個元素入棧,最後從棧中拋出即可。

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int>array;
        stack<int>s;
        while(head!=nullptr)
        {
            s.push(head->val);
            head=head->next;
        }
        int n=s.size();
        while(!s.empty())
        {
            array.push_back(s.top());
            s.pop();
        }
        return array;
    }
};

題目描述

用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素爲int類型。

分析:由於棧是先進後出,而隊列是先進先出,所以爲了用隊列來實現棧的功能,在插入隊列元素時,我們直接把元素壓棧即可。對於出棧,我們先把存元素的棧中的元素依次拋出壓入另一個棧,然後拋出棧頂元素,重新把元素壓入原來的棧即可。

class Solution
{
public:
    void push(int node) {
       stack1.push(node);
    }
 
    int pop() {
        int num=0;
        while(!stack1.empty())
        {
            num=stack1.top();
            stack1.pop();
            stack2.push(num);
        }
        int number=stack2.top();
        stack2.pop();
       while(!stack2.empty())
       {
           stack1.push(stack2.top());
           stack2.pop();
            
       }
        return number;
    }
 
private:
    stack<int> stack1;
    stack<int> stack2;
};

題目描述

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。 NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。

分析:這道題敘述的感覺很複雜,其實出題點就是如果數組大小爲0,就返回0,否則就返回數組中的最小元素即可。

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        int len=rotateArray.size();
        if(len==0)
            return 0;
        int min=rotateArray[0];
        for(int i=1;i<len;i++)
        {
            if(rotateArray[i]<min)
                min=rotateArray[i];
        }
        return min;
    }
};

題目描述

大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。

n<=39

class Solution {
public:
    int Fibonacci(int n) {
        int Fc=0;
        if(n>39)
            return 0;
        else if(n==2||n==1)
            return 1;
        else if(n==0)
            return 0;
        else
        {
            int Fa=1,Fb=1;
            for(int i=3;i<=n;i++)
            {
                Fc=Fa+Fb;
                Fa=Fb;
                Fb=Fc;
            }
        }
        return Fc;
    }
};

對於有的算法,我的可能算法複雜度很高,如果哪位朋友有好的想法,歡迎指出啊!謝謝。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章