数据结构里简单上手了C,又简单了解了概念与方法(算法部分练到再学),现在参考这个,从新手练起:
CS专业免费刷题网站分享|超全算法&数据结构习题专业详解,从菜鸟进阶大神三周就够了!...-CSDN博客
计划每晚刷一些:
1.LintCode新手必刷50题
新手必刷编程50题 - LintCode
弄完这个接下来要刷一些关于数据结构的题,用来熟悉下语法。但是也有一些有意思的题:
1.1 二维数组与二级指针
之前的文章里,我认识到数组与指针间的某些关系,比如指针加1会导致地址移动一个数组元素对应长度、指针也能用[]来运算等等,但是*数组约等于**变量,而一个数组类型的指针,它的一个元素类型就是一个数组,所以**变量就是二维数组。或者放指针的数组。
1.2 二叉树三种遍历非递归实现
这里用到栈的思想,在写代码时要想到三种变量——此时遍历到的量、栈顶元素和出栈元素。
重点要放在栈顶元素上,而不是此时正在遍历的东西上;关注此时遍历到的量在什么情况下入栈、什么时候对栈顶出栈,对出栈元素进行操作?
2. 力扣
2.1 数据结构 考研版
分享|在力扣备战考研数据结构 - 讨论 - 力扣(LeetCode)
2.1.1 轮转数组
第一道题就超时翻车了,炼码(lintcode)只考虑完成与否,没有考虑时空间复杂度。
问了AI,要用数组翻转法:感觉本质上来说还是一种双指针法。
代码:
// 辅助函数:用于翻转数组中的指定区间 [start, end] void reverse(int* nums, int start, int end) { while (start < end) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } void rotate(int* nums, int numsSize, int k) { // 1. 处理 k 大于数组长度的情况 k = k % numsSize; // 如果 k 为 0,说明不需要任何轮转,直接返回 if (k == 0) return; // 2. 翻转整个数组 reverse(nums, 0, numsSize - 1); // 3. 翻转前 k 个元素 reverse(nums, 0, k - 1); // 4. 翻转剩余的 n - k 个元素 reverse(nums, k, numsSize - 1); }启发:简单的算法感觉就是过程上玩指针?结果上尽可能直接面向结果