
題目解析:現在有一個陣列nums,要求輸出一個新的陣列,每個位置的值是除了自己以外其餘所有數字的乘積,而且不能使用除法
解題思路:先算一個前綴乘積v,v[i]代表從0到i所有數字乘起來的結果;再算一個後綴乘積v1,是從陣列尾端往前乘;最後每個位置的答案就是它左邊的前綴乘積乘上右邊的後綴乘積,頭尾兩個位置因為沒有左邊或右邊,所以當作1來處理
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int n = nums.size();
vector<int> v, v1, ans;
v.push_back(nums[0]);
for (int i = 1; i < n; i++) {
v.push_back(v[i-1] * nums[i]);
}
v1.push_back(nums[n-1]);
for (int i = n-2, j = 0; i > 0; i--, j++) {
v1.push_back(v1[j] * nums[i]);
}
for (int i = 0; i < n; i++) {
int left = (i == 0) ? 1 : v[i-1];
int right = (i == n-1) ? 1 : v1[n-2-i];
ans.push_back(left * right);
}
return ans;
}
};

題目解析:判斷一個陣列裡面是否存在三個遞增的數字(不用連續,只要順序上遞增即可),有的話回傳true,沒有就回傳false
解題思路:設兩個變數a跟b,分別用來記錄目前看過最小跟第二小的數字,遍歷陣列時如果遇到比a小的就更新a,比a大但比b小的就更新b,如果遇到比a跟b都大的數字,代表已經湊齊三個遞增的數字了,直接回傳true,跑完迴圈都沒找到就回傳false
class Solution {
public:
bool increasingTriplet(vector<int>& nums) {
int a = INT_MAX, b = INT_MAX;
for(int i=0; i<nums.size(); i++){
if(a >= nums[i]) a = nums[i];
else if(b >= nums[i]) b = nums[i];
else return 1;
}
return 0;
}
};

題目解析:現在有一個字元陣列chars,要求把連續重複出現的字元原地壓縮成「字元+出現次數」的形式(如果只出現1次就不用寫數字),並回傳壓縮後的長度
解題思路:先用n計算目前這個字元連續出現了幾次,當遇到跟前一個不一樣的字元時,就把字元跟次數(次數大於1才需要寫)塞進新的vector v裡面,然後重新從n=1開始算下一個字元,迴圈跑完後別忘了把最後一組字元跟次數也塞進去,最後把chars換成v,回傳v的長度
class Solution {
public:
int compress(vector<char>& chars) {
vector<char> v;
char c = chars[0];
int n = 1;
for(int i=1; i<chars.size(); i++){
if(c != chars[i]){
v.push_back(c);
string s = to_string(n);
if(n != 1){
for(int i=0; i<s.size(); i++){
v.push_back(s[i]);
}
}
n = 1;
c = chars[i];
}else{
n++;
}
}
v.push_back(c);
string s = to_string(n);
if(n != 1){
for(int i=0; i<s.size(); i++){
v.push_back(s[i]);
}
}
chars = v;
return v.size();
}
};