ARTS打卡第六周
Algorithm:每周至少做一個 leetcode 的算法題
31. 下一個排列
實現(xiàn)獲取 下一個排列 的函數(shù)喇澡,算法需要將給定數(shù)字序列重新排列成字典序中下一個更大的排列馅而。
如果不存在下一個更大的排列猖毫,則將數(shù)字重新排列成最小的排列(即升序排列)。
必須 原地 修改伴挚,只允許使用額外常數(shù)空間呛每。
示例 1:
輸入:nums = [1,2,3]
輸出:[1,3,2]
示例 2:
輸入:nums = [3,2,1]
輸出:[1,2,3]
示例 3:
輸入:nums = [1,1,5]
輸出:[1,5,1]
示例 4:
輸入:nums = [1]
輸出:[1]
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
代碼:
public void nextPermutation(int[] nums) {
int n = nums.length;
if (n == 0) {
return;
}
// 第1步缩滨,尋找最后一個正序呐萨,尋找方法:從后向前找。
int i = n - 1;
while (i > 0 && nums[i - 1] >= nums[i]) {
i--;
}
// i==0,表示未找到最后的排列
if (i != 0) {
// 第2步底哥,從后往前找一個比array[i-1]大的第一個數(shù)字咙鞍。
int j = n - 1;
while (j > i && nums[j] <= nums[i - 1]) {
j--;
}
// 第3步,交換array[i-1],array[j]
int tmp = nums[i - 1];
nums[i - 1] = nums[j];
nums[j] = tmp;
}
// 第4步趾徽,把i及其后面的序列反序续滋。
while (i < n - 1) {
int tmp = nums[i];
nums[i] = nums[n - 1];
nums[n - 1] = tmp;
i++;
n--;
}
}
官方解答:
void nextPermutation(vector<int>& nums) {
int i = nums.size() - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i >= 0) {
int j = nums.size() - 1;
while (j >= 0 && nums[i] >= nums[j]) {
j--;
}
swap(nums[i], nums[j]);
}
reverse(nums.begin() + i + 1, nums.end());
}
作者:LeetCode-Solution
鏈接:https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-by-leetcode-solution/
來源:力扣(LeetCode)
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)孵奶,非商業(yè)轉(zhuǎn)載請注明出處疲酌。
Review:閱讀并點評至少一篇英文技術(shù)文章
[虛擬的virtual-delete運行時出現(xiàn)什么情況]](https://eli.thegreenplace.net/2015/c-deleting-destructors-and-virtual-operator-delete/)
項目中幾乎沒有使用自定義 operator delete 的情況,所以對此不算了解了袁;不過讀了effective C++之后朗恳,里面有一章表示 operator new需要和operator delete需要一一對應(yīng),我可能需要再重新讀一遍了载绿。
Tip:學(xué)習(xí)至少一個技術(shù)技巧
class A
{
public:
void Func()
{
printf("this is a function");
}
virtual void Func2()
{
printf("this is function2");
}
}
A* test = nullptr;
test.Func();
test.Func2();
如此代碼會產(chǎn)生什么后果粥诫?!
成員函數(shù)不崩潰崭庸,虛函數(shù)崩潰
成員函數(shù)傳入this指針為空臀脏,但函數(shù)內(nèi)部未使用this指針,一切照常運行冀自。執(zhí)行虛函數(shù)時,成員包含的虛函數(shù)指針為空秒啦,導(dǎo)致無法找到函數(shù)調(diào)用點熬粗,最終空指針崩潰。
std::string 的 += ("1111\0")
std::string 的 append("1111\0",5)
兩個運行的結(jié)果不一致余境,有興趣的可以自行研究一下驻呐。
Share:分享一篇有觀點和思考的技術(shù)文章
工作中遇到了肉眼觀看的兩個字符串灌诅,但是卻無法匹配的問題。
仔細對比后含末,發(fā)現(xiàn)其中一個長度為19猜拾,另一個長度為20,多了一個\0的存在佣盒。
例如:
str 看起來是 _T("1\0");
str2 看起來是 _T("1");
其實上面兩個字符幾乎沒有差別挎袜,比較的時候也應(yīng)該時正確的,比如使用 strcmp的時候肥惭,在雙方遇到\0的時候停止比較盯仪,兩者會返回相等,不過使用str的==判斷蜜葱,會不等全景,因為str的==符號在運行時,先比較兩者的長度牵囤,后比較兩者的數(shù)據(jù)爸黄,所以雖然值看起來是相同的,不過由于字符串的長度不相等揭鳞,導(dǎo)致直接返回false炕贵,產(chǎn)生外部邏輯上的問題。