学习目标:
1.在2021年2月底刷完力扣10%题目。 2.从零开始学习C,C++,python。 3.用多种方法写出解题思路,以及理解代码。原计划是想自己将每道题的代码也顺便写出来,但发现自己动手能力太弱,基础太少,耗时太长。如果按照原计划完全无法完成我既定任务,因此就简单的每题写出思路,目标是至少遇上这类题目都能有所思路,然后再把常用的代码模型锻炼下。
学习内容:
1.两数之和
题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
你可以按任意顺序返回答案。
思考:说真的,最开始的时候我还以为是真的就是a+b的入门级题目,然后看完题目后才知道想错了。思路十分的简单,就是固定一个nums,去寻找taget-nums是否存在在这个数组当中。
主要是暴力法和哈希表法两种方法,我在解题的时候使用的是暴力法,但事实告诉我C语言用暴力法只会导致超时,时间复杂度为O(n^2),使用哈希表法,会用到O(n)的空间复杂度,但这样查找taget-nums的时间就缩短了,明显的哈希表只是在大学的课程学了概念,但在代码使用上很少使用,甚至可以说都不知道怎么使用,这是我所欠缺的地方。
总结:
1.和数据结构有关的题目一般别用C写,如果不是项目而是面试,考试过程,用C写出一个HASH表的时间都足够别人写两题了。C++,python等语言的做法比C容易太多了,虽然明白在效率上真的可能比不过,但初学者来说,肯定先考虑事情能不能快速完成而不是代码效率。毕竟不是人人是ACM大佬。
2.返回值的特别,题目中并没有说明返回值是什么形式,这需要做题者的经验,对于C语言来说就是给returnSize分配空间当成数组返回,而对于第一次做的我来说,我会把returnSize当成返回大小的说明,另外再申请空间,返回数值。
3.这题主要考察的可能还主要是哈希表的使用。对于C语言选手可能相对的痛苦,而且官方给出的答案引用了其它有关HASH的库,真让一个人写出HASH以及其调用的功能估计短时间难以实现,,不知道有没有C语言选手能给我思路。
2.两数相加
题目:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思考:说真的我的思路是两种,一是将其转为整型,再进行计算,二是对齐链表,短的用0填充。这题主要考察的是对链表的操作,与合并链表题目十分相似,基本掌握一题这类题都很好做。有一说一,对于C语言选手来说,这题比上题简单多了。
3.无重复字符的最长子串
题目:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
思考:最开始我有个思路是寻找两个临近字符之间的最长长度,但实际这么就算就忽略了在这两个字符之间存在重复字符的可能,因此是错误的,后来在看完讨论后,才明白解法。
1.解法可以使用两个指针,先判断字符串长度是否大于1,如果是0,则返回0,是1则返回1。
2.当字符串长度大于等于2时,两个指针开始均指向下标0,并将该字符放入一个列表当中。
3.循环开始,移动指针2往后,如果指针2读取的新字符在创建的列表当中,则记录下当前长度,而指针1一直移动到重复的字符后面,并在移动的过程将序列删除。
4.每次循环过程都会更新当前最长长度,直到指针2指向最后一位。为了减少空间复杂度,可以不新创列表而是在原列表上进行。