几道题目
剑指 Offer 03. 数组中重复的数字
这道题的原地交换主要是是数组下标的应用
nums[i] / nums[nums[i]] 具有的意义都很重要
nums[nums[i]]
[2, 3, 1, 0, 2, 5, 3]
例如nums[1]=3 mums[nums[1]]=0
当nums[nums[i]]=nums[i] ,即找到了一组重复的值,这个思路在其他的重复值的题目中也是看情况可以用的
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int i = 0;
while(i < nums.size()) {
if(nums[i] == i) {
i++;
continue;
}
if(nums[nums[i]] == nums[i])
return nums[i];
swap(nums[i],nums[nums[i]]);
}
return -1;
}
};
作者:jyd
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-yua/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
剑指 Offer 04. 二维数组中的查找

这个题的思路大概是看规律查找
下一行大于上一行,右边一列大于左边一列,因此i,j不用遍历完一行再遍历下一行,直接从最右边一列开始比较即可
int i = 0 ;
int j = matrix.size() - 1 ;
while(i <= matrix.size() - 1 && j>=0){
if(target == matrix[i][j]){
return true;
}
if(matrix[i][j] > target){
j--;
}else{
i++;
}
}
剑指 Offer 05. 替换空格
双指针在数组字符串的题目中经常用到,经常用来简化一些操作
class Solution {
public:
string replaceSpace(string s) {
int count = 0; // 统计空格的个数
int sOldSize = s.size();
for (int i = 0; i < s.size(); i++) {
if (s[i] == ' ') {
count++;
}
}
// 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小
s.resize(s.size() + count * 2);
int sNewSize = s.size();
// 从后先前将空格替换为"%20"
for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) {
if (s[j] != ' ') {
s[i] = s[j];
} else {
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
};
作者:carlsun-2
链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/solution/cshuang-100dong-hua-zhan-shi-xiang-xi-zhu-shi-by-c/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

浙公网安备 33010602011771号