1.应用场景/目的
1.锻炼与提升个人解决问题的能力 2.应对面试
备注: 周一, 周三, 周五实现一道算法 //比较简单的就不再收录 |
2.学习/操作
1.给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。//20191116 上沙 https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1012/ 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 个人解法: [实现语言: PHP] class Solution { /**
备注: 将代码直接copy在编辑代码区域, 然后点击执行, 观察结果即可.
解答: //执行时间挺快的, 内存消耗为什么会这么多, 另外这个并不是时空复杂度分析 TBD 即滑动窗口解法 // 执行用时 :12 ms, 在所有 PHP 提交中击败了97.99%的用户 class Solution {
/** * @param String $s * @return Integer */ function lengthOfLongestSubstring($s) { $lens = strlen($s);//字符串长度 $tmp = ''; //用于存储子串,不包含有重复的字符 $len = 0; //最长子串的长度 for($i=0; $i<$lens; $i++) { $re = strpos($tmp,$s[$i]);//判断是否有重复字符 if(false !== $re) {//有重复 $tmp .= $s[$i];//先追加上去 例如pwasw $tmp = substr($tmp,$re+1);//从重复位置开始 截取后 pwasw=>asw }else {//无重复字符 $tmp .= $s[$i];//追加到后面 } //每一次过去后,比较当前的tmp 与上一次的 len 谁更大 $len = strlen($tmp)>$len ? strlen($tmp) : $len; } return $len;//返回最后子串长度 } }
解法: 有三种思路:
分别为: TBD 暴力法 TEL(Time Limit Exceeded) 超过时间限制 滑动窗口 优化的滑动窗口
2.两数之和 算法 //20191117 详情: https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9
个人解法: class Solution {
/** * @param Integer[] $nums * @param Integer $target * @return Integer[] */ function twoSum($nums, $target) { $count = count($nums); for($i=0; $i<$count; $i++){ for($j=$i+1; $j<$count; $j++){ if($nums[$i] + $nums[$j] === $target){ return [$i, $j]; } } } return [0, 0]; } }
结果: 通过 用时1616 ms, 内存15.9 MB
参考他人实现:
暴露问题: 1.代码书写不认真 2.代码时空复杂度很高
最佳实现: 最少用时8ms, 内存 16 MB
class Solution { /**
3.两数相加 算法 //20191118 上沙 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 详情: https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode/
结果: 没写出来
参考他人实现: code: //重点在于深拷贝 浅拷贝 指针重点在于深拷贝 浅拷贝 指针 /** * Definition for a singly-linked list. * class ListNode { * public $val = 0; * public $next = null; * function __construct($val) { $this->val = $val; } * } */ class Solution {
/** * @param ListNode $l1 * @param ListNode $l2 * @return ListNode */ function addTwoNumbers($l1, $l2) { $listNode = new ListNode(0); $l = $listNode; $a = 0;
do { $v1 = $l1->val ?? 0; $v2 = $l2->val ?? 0; $res = $v1 + $v2 + $a; $a = floor($res/10); $l->next = new ListNode($res%10); $l = $l->next; $l1 = $l1->next; $l2 = $l2->next; } while ($l1 || $l2 || $a);
return $listNode->next; } }
提交结果: 执行用时 :24 ms, 在所有 php 提交中击败了62.03%的用户 内存消耗 :15 MB, 在所有 php 提交中击败了10.05%的用户
暴露问题: 1.链表不熟悉 2.解题思路没有,PHP语法有些不是很熟悉
最佳实现: 官方解答: //初等数学 TBD https://leetcode-cn.com/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode/
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。 +----+--------+ +---------------------+
详细: https://leetcode-cn.com/problems/second-highest-salary/ 官网解答: https://leetcode-cn.com/problems/second-highest-salary/solution/di-er-gao-de-xin-shui-by-leetcode/
答案 方法一:使用子查询和 LIMIT 子句 将不同的薪资按降序排序,然后使用 LIMIT 子句获得第二高的薪资。 MySQL MySQL
MySQL
5.第N高的薪水 20191123
解答: 查询思路类似求第二高的薪水,需注意考虑N不合理的情况。测试第一轮就遇到N为0的情况,所以加上了处理逻辑。 详细如下://存储过程, 这个没有认真学习, 操作过, 所以还是要认真学习下. TBD CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
6.分数排名 20191125 上沙 周一 方法一: //最简单的语句, 注意,mysql版本8已至此窗口函数这个功能,虽然在leetcode上运行不成功,可能的原因是后台的mysql数据库版本不是最新的。 select score, dense_rank() over(order by Score desc) as Rank from Scores;
方法二: //执行失败! 语法还没有看明白! 容易理解的语句,且效率高于99%
执行成功: //语法没看明白! select Score, ((case when @prevRank = Score then @curRank when @prevRank := Score then @curRank:=@curRank +1 else @curRank:=@curRank +1 end )*1) as Rank FROM Scores,(select @curRank:=0,@prevRank:=NULL) p ORDER BY Score desc
7.180. 连续出现的数字 20191127 上沙 周三 https://leetcode-cn.com/problems/consecutive-numbers/
8.182. 查找重复的电子邮箱 20191129 上沙 周五 https://leetcode-cn.com/problems/duplicate-emails/ 最简答的答案: SELECT FROM Person group by Email having count(Email) > 1;
个人答案: 有想到group by 和having 但是想复杂了[运用笛卡尔积来做]
9.181. 超过经理收入的员工 20191202 上沙 周一 https://leetcode-cn.com/problems/employees-earning-more-than-their-managers/ 官网两种答案都有想到,并通过。
10.183. 从不订购的客户 20191204 上沙 周三 官网答案确实有点平常了,尽管个人答案也是如此.
11.184. 部门工资最高的员工 20191206 上沙 周五 笔记:
12.185. 部门工资前三高的所有员工 20191209 上沙 周一 https://leetcode-cn.com/problems/department-top-three-salaries/ # Write your MySQL query statement below
-- 个人没有解出来
-- 方法一 //推荐, 但实际开发中可考虑使用语言处理 SELECT d.NAME AS 'Department', e1.NAME AS 'Employee', e1.Salary FROM Employee e1 JOIN Department d ON e1.DepartmentId = d.Id WHERE 3 > ( SELECT COUNT( DISTINCT e2.Salary ) -- DISTINCT是为了并列名次算做同一个
FROM Employee e2 WHERE e2.Salary > e1.Salary AND e1.DepartmentId = e2.DepartmentId );
-- 方法二 SELECT Department.NAME AS Department, e1.NAME AS Employee, e1.Salary AS Salary FROM Employee AS e1, Department WHERE e1.DepartmentId = Department.Id AND 3 > (SELECT count( DISTINCT e2.Salary ) FROM Employee AS e2 WHERE e1.Salary < e2.Salary AND e1.DepartmentId = e2.DepartmentId ) ORDER BY Department.NAME,Salary DESC;
协助理解:
后续补充 ... 后续补充 以下是模板 结果: 通过 用时1616 ms, 内存15.9 MB
参考他人实现:
暴露问题: 1.代码书写不认真 2.代码时空复杂度很高
最佳实现: ....
|
3.问题
1.相同算法, 实现语言不同, 效率如何? //时间复杂度 20191118 周一 同一个算法, 实现预言的级别越高, 执行效率就越低.
2.实际开发中, 写算法, 时间复杂度考虑的是哪个指标? 最好/最坏/平均时间复杂度? 最坏时间复杂度. 时间复杂度总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长. 严蔚敏教材中原话, 虽然讨论多年,对于这种在语言层次上的效率问题,建议不要以特例来解释其优劣, 该结论肯定是没有错误的. 另外,思考原因/原理
实际上,在大多数情况下,我们并不需要区分最好、最坏、平均情况时间复杂度三种情况。 很多时候,我们使用一个复杂度就可以满足需求了。只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们才会使用这三种复杂度表示法来区分。
3.isset的内部实现原理是什么? 是否是循环遍历? 在求解[两数之和]算法题目时, 使用isset 时间复杂度就降下来, 想知道PHP的isset()内部实现机制 TBD
TBD |
4.参考
https://leetcode-cn.com/explore/interview/card/bytedance/242/string/1012/ //详细题目-字节跳动 https://time.geekbang.org/column/article/40447 //极客时间-数据结构与算法之美 王道系列-数据结构 |
后续补充
...