写在前面的碎碎念:电脑坏了一周以后的终于回归,可以继续更新啦(ps.老综联想真是又贵又慢呀)因此这一周的Java停滞,lc停滞。。。仅把剑指offer粗读了一遍,之后一周应该会把剑指offer1刷完;计网学的也差不多了,其他课粗看了些,没啥头绪。
2021-11-24始 剑指offer二刷~记录有价值的题
剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1
的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
-
排序法
时间O(log n) -
哈希表
-
书上的空间优先解法
不断交换,直到发现重复的数字。时间复杂度O(n) 空间O(1)
注意:做题之前先要判别好无效输入测试用例,本题中,排除数组为0的情况,输入空指针,长度为n的数组中输入了0-n-1以外的数字都要先排除掉!!!
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int n=nums.size();
if(n==0) return false;
for(int i=0;i<n;i++)
{
if(nums[i]<0||nums[i]>n-1)
{
return false;
}
}
for(int i=0;i<n;i++)
{
if(nums[i]!=i)
{
if(nums[nums[i]]==nums[i]) return nums[i];
swap(nums[i],nums[nums[i]]);
}
}
return -1;
}
};
剑指 Offer 03. 数组中重复的数字(不修改数组找出重复的数字)
长度为n+1的数组里所有数字都在1-n的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。
二分的思想。
我们把1-n的数字从中间的数字m分成两部分
前面一半1-m,后面一半m+1-n
如果1-m的数字的数目超过m,那么这一半的区间里一定包含重复数字;否则重复的数字包含在另一半里;可以不断一分为二,直到找到一个重复的数字
时间O(nlogn)但数组本身完全没有变,以时间换空间
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
不用库函数replace…
先把数组扩容,双指针,一个指针指数组尾部,一个指针指原来的字符串,从尾部扫到头部,遇到空格就插入“%20”,否则就插入原字符。
学习点:倒序遍历解决问题;双指针
class Solution {
public:
string replaceSpace(string s) {
int space=0;
int len=s.length();
for(int i=0;i<len;i++)
{
if(s[i]==' ') space++;
}
s.resize(len+space*2);
int newp=len+space*2-1;
int oldp=len-1;
for(int i=oldp;i>=0;i--)
{
if(s[i]!=' ') s[newp--]=s[i];
else
{
s[newp--]='0';
s[newp--]='2';
s[newp--]='%';
}
}
return s;
}
};