Offer68題 Day1

招財進寶發表於2024-10-20

LCR 120. 尋找檔案副本

class Solution { // offer 03
public:
    int findRepeatDocument(vector<int>& documents) { // 方法:雜湊表,查詢元素是否存在
        unordered_set<int> vsi;
        for(int i=0;i<documents.size();i++){
            if(vsi.count(documents[i])){return documents[i];} // count()>0說明已經出現過
            vsi.insert(documents[i]);  // set中沒有就放入
        }
        return -1;  // 時間O(n) , 空間O(n),n為doc.size()
    }
};

//////////////////////////////////////////////////////////////////////
// 排序後,判斷相鄰是否相等?時間O(nlog),空間O(logn)
class Solution {
public:
	int findRepeatDocument(vector<int>& documents) {
		sort(documents.begin(),documents.end());
		for(int i=0;i<documents.size();i++){
			if(documents[i]==documents[i+1]){return documents[i];}
		}
        return -1;
	}
};

240. 搜尋二維矩陣 II

class Solution {  // 從左下開始找,時間O(m+n),mn問matrix行數列數,空間O(1)
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int i=matrix.size()-1;   // 最後一行
        int j=0;                 // 第一列
        while(i>=0 && j<matrix[0].size()){
            if(matrix[i][j]==target) return true;
            else if(matrix[i][j]>target) i--;   // 說明右邊都比target大,往上一行找
            else j++;                           // < 要往右邊找
        }
        return false;
    }
};

/*
vector<vector<int>> matrix = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

matrix.size() 將返回 3,因為有三行。
matrix[0].size() 將返回 4,因為第一行有四個元素。
*/

LCR 122. 路徑加密(單個字元替換)

class Solution {
public:
    string pathEncryption(string path) {
        string ans=path;  // 建立path副本
        for(auto& c:ans){
            if(c=='.'){ c=' ';}
        }
        return ans;
    }
};

類似:面試題 05. 替換空格 (多個字元替換)

題目描述: 請實現一個函式,把字串 s 中的每個空格替換成"%20"。
示例 1:
輸入:s = "We are happy."
輸出:"We%20are%20happy."


#include <iostream>
#include <string>
using namespace std;

class Solution {
public:
	string replaceSpace(string s) {
		string ans;
		for (const char& c : s) {               // 遍歷輸入字串 s
			if (c == ' ') {	ans += "%20"; } // 替換空格為 "%20"
			else { ans += c; }              // 其他字元直接追加到string
		}
		return ans;
	}
};

int main() {
	const string s = "We are happy.";
	Solution sol;
	const string result = sol.replaceSpace(s);
	cout << result << endl; // 輸出: "We%20are%20happy."
	return 0;
}

LCR 123. 圖書整理 I 或 從尾到頭列印連結串列

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {  // 將連結串列元素放入陣列,反轉陣列
public:
    vector<int> reverseBookList(ListNode* head) {
        vector<int> result;
        ListNode* curr=head;
        while(curr!=nullptr){
            result.push_back(curr->val);
            curr=curr->next;
        }
        reverse(result.begin(),result.end());
        return result;
    }
};