刷题总结——数据结构基础

2022/3/6

1.leetcode136只出现一次的数字。

位运算。注意异或运算三个性质。

异或运算有以下三个性质。

    任何数和 000 做异或运算,结果仍然是原来的数,即 a⊕0=a。
    任何数和其自身做异或运算,结果是 000,即 a⊕a=0。
    异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。

2.leetcode169多数元素。

注意排序法。

2022/3/7

1.leetcode15三数之和。

2.leetcode18四数之和。

总结:这两道题都用的是双指针法。注意以下这个小技巧。

2022/3/9

1.leetcode541反转字符串

C++有内置的库函数,reverse。reverse函数头文件是algorithm。

   例如,交换vector容器中元素的顺序

vector<int> v = {5,4,3,2,1};
reverse(v.begin(),v.end());//v的值为1,2,3,4,5

       还有string类的字符串

string str="www.mathor.top";
reverse(str.begin(),str.end());//str结果为pot.rohtam.wwww

2.leetcode剑指offer05替换空格

注意从后往前。

3.leetcode151翻转字符串里的单词

注意去掉多余的空格利用的是双指针。注意分为去掉字符串头部、中间、尾部三个部分。

整体反转-》局部反转。

4.leetcode剑指offer58左旋字符串

使用substr 和 反转时间复杂度是一样的 ,都是O(n),但是使用substr申请了额外空间,所以空间复杂度是O(n),而反转方法的空间复杂度是O(1)

局部反转-》整体反转。

2022/3/11

1.leetcode28实现strstr。

kmp算法掌握。另外注意这个问题,看看收藏里对于consteptr的介绍。我的解决方法如下:

 

 2.leetcode459重复的子字符串

记住吧,不理解。

2022/3/12

1.leetcode27移除元素(双指针)。

2.leetcode26删除有序数组中的重复项。(双指针、unique函数)

注意:

unique函数的功能是元素去重。即”删除”有序序列中所有相邻的重复元素(只保留一个)。此处的删除,并不是真的删除,而是指重复元素的位置被不重复的元素给占领了。

unique函数的函数原型如下:

1.只有两个参数,且参数类型都是迭代器:

iterator unique(iterator it_1,iterator it_2);

这种类型的unique函数是我们最常用的形式。其中这两个参数表示对容器中[it_1,it_2)范围的元素进行去重(注:区间是前闭后开,即不包含it_2所指的元素),返回值是一个迭代器,它指向的是去重后容器中不重复序列的最后一个元素的下一个元素。

unique函数的去重过程实际上就是不停的把后面不重复的元素移到前面来,也可以说是用不重复的元素占领重复元素的位置。

2.unique函数通常和erase函数一起使用,来达到删除重复元素的目的。(注:此处的删除是真正的删除,即从容器中去除重复的元素,容器的长度也发生了变换;而单纯的使用unique函数的话,容器的长度并没有发生变化,只是元素的位置发生了变化)。

3.leetcode283移动零

官方的方法比较好,交换。

4.leetcode151反转字符串里的单词

这里注意一个问题。reverse函数的两个参数两个迭代器是左闭右开区间。第二个参数要指向你要反转的那段字符串的最后一个字母的下一个位置而不是最后一个字母那里。

 if(s[i] == ' ')
            {
                reverse (s.begin()+start,s.begin()+i);//注意这里是s.begin()+i而不是s.begin()+i-1
                start = i+1;
            }

2022/3/16

1.leetcode156逆波兰表达式求值。记得转字符串为数字用stoi函数。转字符用ch-'0'。

2.leetcode239滑动窗口最大值。单调队列。

2022/3/22

1.leetcode101对称二叉树。递归和迭代的方式。

2.leetcode100两颗相同的树。递归和迭代的方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值