1. 程式人生 > >【劍指offer{1-3}】二維陣列查詢、空格替換、從尾到頭列印連結串列

【劍指offer{1-3}】二維陣列查詢、空格替換、從尾到頭列印連結串列

注:程式碼均在牛客網上執行,結果均通過!

二維陣列查詢

題目描述

  • 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
  • 選擇最右上角的數值與給定的target進行比較,如若數值小則往下移,如若數值大則往左移即可。

C++程式碼展示

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) 
    {
        int rows = array.size();
        int cols = array[0].size()-1;
        int row = 0;
        while(row<rows && cols>=0)
        {
            if(target==array[row][cols])
            {
                return true;
            }
            else if(target>array[row][cols])
            {
                row++;
            }
            else
            {
                cols--;
            }
        }
        return false;
    }
};

空格替換

題目描述

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

C++程式碼展示

class Solution {
public:
	void replaceSpace(char *str,int length) 
    {
        if(str==NULL)
        {
            return;
        }
        int lenSpace = 0;
        int oldLength = 0;
        for(int i = 0;i<length-1;i++)
        {
            if(str[i]==' ')
            {
                lenSpace++;
            }
            oldLength++;
        }
        int newLen = oldLength + lenSpace*2;
        int first = oldLength-1;
        int last = newLen-1;
        while(first<=last && first>=0)
        {
            if(str[first]!=' ')
            {
                str[last--] = str[first];
            }
            else if(str[first]==' ')
            {
                str[last--] = '0';
                str[last--] = '2';
                str[last--] = '%';
            }
            first--;
        }
	}
};

從頭到尾列印連結串列

題目描述

  • 輸入一個連結串列,按連結串列值從尾到頭的順序返回一個ArrayList。
  • 壓入一個棧中,棧的特點是先進後出,因此棧頂元素就是連結串列的表尾節點,依次彈出。

C++程式碼展示

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) 
    {
        vector<int>result;
        if(head==NULL)
        {
            return result;
        }
        ListNode*p = head;
        ListNode*q = head->next;
        head->next = NULL;
        ListNode *r = NULL;
        while(q!=NULL)
        {
            r = q->next;
            q->next = p;
            p = q;
            q = r;
        }
        head = p;
        ListNode *ptemp = head;
        while(ptemp!=NULL)
        {
            result.push_back(ptemp->val);
            ptemp = ptemp->next;
        }
        return result;
    }
};