软件工程师数据库面试技巧之 SQL中的第二名记录 Software Engineer Interview Question - The Second Highest


Question: Write a SQL query to get the second highest salary from the Employee table. 


现在最吃香的工程师是 全栈工程师 (Full Stack), 因此你除了要好的算法数据结构知识外 你还需要懂数据库等计算机知识. 有人说, SQL好简单, 其实SQL也可以考考你的逻辑, 比如有这么一个简单的 (含有两个字段, 三行记录) 的关系表 (假设表名为 Employee).


 +—-+——–+

| Id | Salary |

+—-+——–+

| 1  | 100    |

| 2  | 200    |

| 3  | 300    |

+—-+——–+


请输出第二高的记录, 也就是 ID = 2, Salary = 200. 


如果不存在第二高, 比如 两条记录都是 100, 100, 那么应该返回 null. 而 100, 100, 90 应该返回90而不是100. 这样的话  ” select from Employee order by salary desc limit 1,1 “  就不对了.


 Another example, Input Salary Array = [100, 100], the output should be null; When array equals [100, 100, 90]. The output should be 90 (second highest salary) instead of 100. Therefore the common mistake is the following: 


 你也可以用 group by: 


 Some might correct this via group by: 


select Salary as SecondHighestSalary from Employee group by Salary order by Salary limit 1,1 


 但是当第二高记录不存在时, 该SQL返回空而不是 null.  


 However, it will return empty instead of null when it does not exist. 


Input: {“headers”: {“Employee”: [“Id”, “Salary”]}, “rows”: {“Employee”: [[1, 100]]}}

Output: {“headers”: [“SecondHighestSalary”], “values”: []}

Expected: {“headers”: [“SecondHighestSalary”], “values”: [[null]]}


For example, given the above Employee table, the second highest salary is 200. If there is no second highest salary, then the query should return null. 


 The second largest number is always smaller than the largest number. We use a inner SQL to get the maximum salary and we just need to get the largest number that is smaller than this largest number. 


so, if the numbers are 100, 100, 90,  it should return 90 instead of 100, which makes “ select from Employee order by salary desc limit 1,1 “ incorrect.



SQL中有 max, min, 但这些都无法直接输出第二高(或者第二低), 但你可以这么想, 我取得了最高的, 剩下的取最高就是第二高了, 是不是很简单? 


select max(Salary)

from Employee

where Salary < (select max(Salary) from Employee)


That is it, no tricks, no sorting, just two SQL selects and two group functions max 


上面黑体的是子查询 先返回最大的记录为 300, 那么接下来意思就很明白了, 比最大值300小的最大值是多少? 200嘛.


 PS: 当年我招程序员的面试的时候 就拿了这一题作为第一题 (45分钟考卷, 10题左右, 这题是送分题) 



Originally published at https://steemit.com Thank you for reading my post, feel free to FOLLOW and Upvote @justyy which motivates me to create more quality posts.


原创首发于 https://steemit.com 非常感谢阅读, 欢迎FOLLOW和Upvote @justyy  能激励我创作更多更好的内容.  


// 已同步到我的中文博客英文算法博客。 



 近期热贴 Recent Popular Posts 




This page is synchronized from the post: 软件工程师数据库面试技巧之 SQL中的第二名记录 Software Engineer Interview Question - The Second Highest

从互联网广告(Adsense)来谈谈 影响 SteemIt 的收入因素


 在玩 STEEMIT 之前, 我的文章收入主要靠着放在网站上的 adsense 广告, 虽然收入很低, 但一个月勉强够四台VPS主机费+域名费+CloudFlare费用. 这几天思考了一下, 其实影响 Adsense 收入和 影响 SteemIt 收入还是有点相像的. 


 页面浏览量 (Page Views), 这就是我们常说的流量 (流量可以变现), 没有流量一切其它优化都是扯蛋. Adsense 广告的流量主要来自SEO 也就是我们常说的搜索引擎优化 e.g. 优化页面关键字标题等. 而steemit 文章的主要流量是来自于 粉丝 (Followers), 虽然也有一部分来自于搜索引擎, 但是比起粉丝的力量, 这部分流量还是小众. 可以理解成博客和新浪微博的区别. 


 有些时候文章没有人点赞, 其实并不是你文章写不好, 很大程度是因为粉丝量较少, 曝光率小. 所以骚年们 别灰心. 先攒攒粉才是王道. SteemIt 文章7天结算(7天后文章就没有收入), 搜索引擎的索引页面的时间也不是立刻马上, 等到被搜索引擎索引上并且给予排名了 也很有可能是7天之后的事情了. 


 页面点击率 (Click Through Rate), 在传统博客上放广告, 广告的位置 大小 甚至是颜色都会影响 读者是否去点你的广告, 而在 SteemIt 就较为简单(因为文章并没有广告, 而文章内容本身就是广告). 只要你文章写的好, 大牛们都会纷纷为你点赞, 这也是提高 SteemIt 页面点击率的唯一方法. 


 点击价钱 (Cost Per Click), Adsense 广告是竞价排名, 价格高者得广告位, 然后这个价格会和博主分成 比如 Adsense 每次有效广告点击, Google 分得 46% 而博主获得54%. 在SteemIt 的世界里, SP高(Steem Power)高者点一次胜过几万小虾米. 每7天文章结算中有15%是专门按SP分给点赞的 而75%是给文章作者. 


 说了这么多, 其实最主要的就是要提高文章质量+提高粉丝数(而这两点也是相辅相成的), 千万别想邪门歪道, 也许骗得了大众一时, 但是并不长久 i.e. what comes quick never lasts. 



Originally published at https://steemit.com Thank you for reading my post, feel free to FOLLOW and Upvote @justyy which motivates me to create more quality posts.


原创首发于 https://steemit.com 非常感谢阅读, 欢迎FOLLOW和Upvote @justyy  能激励我创作更多更好的内容.  


// 已同步到我的中文博客。 



 近期热贴 Recent Popular Posts 




This page is synchronized from the post: 从互联网广告(Adsense)来谈谈 影响 SteemIt 的收入因素

为了 SteemIt 开发了一个 中文简体和繁体自动切换的Chrome浏览器插件 Chrome Extension to Switch between Simplified Chinese and Traditional Chinese Automatically


I wrote this Simple plugin to switch between Simplified Chinese and Traditional Chinese automatically. I have known many friends on steemit who use Traditional Chinese (BIG5 or ZH-TW). However, I am not so comfortable with reading Traditional Chinese. Therefore, this plugin automatically converts traditional Chinese to simplified Chinese automatically or vice versa.



For example, 


English:  I love you!


Simplified Chinese: 我爱你!


Traditional Chinese:  我愛你!


Open source, feel free to create PR to improve this!  https://github.com/DoctorLai/Simplified-and-Traditional-Chinese


Chrome Extension: https://chrome.google.com/webstore/detail/%E7%AE%80%E7%B9%81%E9%AB%94-simplified-and-tradit/olpihmabpjpllgmahlgiakkgaccigpfo


最近在玩SteemIt, 发现很多 cn 社区的中国朋友(特别是台湾 香港还有其它一些海外同胞) 比较喜欢用繁体字, 虽然我们都能看懂繁体, 或者都能看懂简体中文, 但是有时候还是会吃力 觉得累, 有没有方法能自动转换页面呢? 你也许可以用Google Translate, 但是 Google Translate 会在页面上方显示一个翻译栏, 毫无违和感. 


 我有点小强迫, 于是搞了一小时, 整出这么一个玩意: Chrome 浏览器插件: 简繁体 Simplified and Traditional Chinese. 这玩意的好处是 离线也能用(不用联网访问Google Translate), 而且不会在页面的任何地方显示信息, 真正做到润物细无声. 



 


简繁体网页转换方法


您需要使用Chrome浏览器, 然后到网官上去安装插件.   https://chrome.google.com/webstore/detail/%E7%AE%80%E7%B9%81%E9%AB%94-simplified-and-tradit/olpihmabpjpllgmahlgiakkgaccigpfo



 安装完会有一红色国旗图标, 点击后 默认是不转换


然后有三个选项: 



 选择 第二个选项 (ZH-CN) 强行转换成简单中文, 选择第三个选项 (ZH-TW) 强行将当前网页转换成繁体中文. 这些选项会保存于浏览器中直到下次更改. 


 需要注意的是, 转换是在页面加载的时候进行 (document_idle), 所以您需要刷新 (F5) 才能转换当前已经加载后的页面, 不过对于新的页面则会自动转换, 有时候没有转换可能需要等待一会, 如果没有的话, 请按F5刷新再试.


比如 @tumutanzi 的主页被转换成繁体. 



有啥好的建议或者BUG都 @justyy 吧! 


源代码开源于 Github



Originally published at https://steemit.com Thank you for reading my post, feel free to FOLLOW and Upvote @justyy which motivates me to create more quality posts.


原创首发于 https://steemit.com 非常感谢阅读, 欢迎FOLLOW和Upvote @justyy  能激励我创作更多更好的内容.   


// 已同步到我的中文博客 英文 博客。 



近期热贴 Recent Popular Posts 




This page is synchronized from the post: 为了 SteemIt 开发了一个 中文简体和繁体自动切换的Chrome浏览器插件 Chrome Extension to Switch between Simplified Chinese and Traditional Chinese Automatically

XY + XY = YZZ 大白 + 大白 = 白胖胖


XXX原文: https://justyy.com/archives/2047


XXX原文: 中文博客 英文 博客。  


数学题目:大白 + 大白 = 白胖胖

其中 大, 白, 胖 各是一个数字 也就是 0 到 9 


 PowerShell  





Originally published at https://steemit.com Thank you for reading my post, feel free to FOLLOW and Upvote @justyy which motivates me to create more quality posts.


原创首发于 https://steemit.com 非常感谢阅读, 欢迎FOLLOW和Upvote @justyy  能激励我创作更多更好的内容.  


 // 已同步到我的中文博客 英文 博客。 



近期热贴 Recent Popular Posts 




This page is synchronized from the post: XY + XY = YZZ 大白 + 大白 = 白胖胖

Early Autumn 2017, Cambridge, UK (Photography) 英国慢节奏的村庄生活 – 每日散步村口溜娃


Does the British have summer? really? It is August, but I feel that the summer is already gone in 2017… According to Chinese luna calendar, it was the ‘Early Autumn’ two days ago…


So… say bye bye to 2017 Autumn and hope the next summer last longer…


A few photography were taken yesterday, where we took kids to the village playground.


我姐说, 你这住的地方太偏了, 太过于安逸. 只适合养老 (特别像我们的故乡 厦门鼓浪屿). 她说的对, 在这个破地方真的会让人失去斗志, 真是个农村, 也没法炒房(兴家之举), 生活节奏慢, 村里只有一个酒巴和一个车厂. 下午5点之后就很安静. 


但, 住村里的好处是: 空气好, 安静, 村里有几个农场(想看猪啊牛啊都很方便不用门票), 而且村中心 有孩子玩的小型游乐场 (playground). 不缺草地, 不缺蓝天白云. 立秋刚过, 这两天的温度10几度, 不热不冷, 正正好. 


下午5点就吃过饭了, 英国夏天天9点才能暗下来, 于是村口溜溜娃. 


记得刚搬进村里新房的时候请朋友来家里坐客, 一朋友开玩笑说已经看到了我二三十年后的样子, 不知不觉已经过去2年了, 我感觉越来越适应了英国的慢节奏, 心却有点慌. 



 奔跑 



 一起荡秋千 孩子笑抽了 



 在村里长大的亲兄弟 



 英国8月份已经进入秋天 



 媳妇 @happyukgo 弄了个跟估计1米9了都 



 媳妇 @happyukgo 给老二荡秋千 



Originally published at https://steemit.com Thank you for reading my post, feel free to FOLLOW and Upvote @justyy which motivates me to create more quality posts.


原创首发于 https://steemit.com 非常感谢阅读, 欢迎FOLLOW和Upvote @justyy  能激励我创作更多更好的内容.    


// 已同步到我的中文博客中。


近期热贴 Recent Popular Posts 




This page is synchronized from the post: Early Autumn 2017, Cambridge, UK (Photography) 英国慢节奏的村庄生活 – 每日散步村口溜娃

Software Engineer Interview Question – How to Improve Dynamic Programming Space Complexity? 进一步改进动态规化的空间复杂度


In yesterday’s post, we present the final ‘optimized’ solution using Dynamic Programming, which is implemented using a 2 dimensional array with iteration. Let’s review this code: 


昨天发了这个帖子讲到动态规化的2种改进, 一种是记忆, 另一种是把递归改成迭代. 今天稍微想了一下, 还可以从空间复杂度里入手. 我们先看一下之前的’最优’方案: 


function f($x, $y) {


  $ans = array();


  for ($i = 0; $i <= $x; ++ $i) $ans[$i][0] = 1;


  for ($i = 0; $i <= $y; ++ $i) $ans[0][$i] = 1;


  for ($i = 1; $i <= $x; ++ $i) {


    for ($j = 1; $j <= $y; ++ $j) {


      $ans[$i][$j] = $ans[$i - 1][$j] + $ans[$i][$j - 1]; 


    }


  }


  return $ans[$x][$y];


}


 We know that the time complexity is O(xy) and the space complexity is also O(xy) where a 2-D array is allocated. So, can we do better? If we take a look at the core iteration of this Dynamic Programming (DP) algorithm: 


 $ans[$i][$j] = $ans[$i - 1][$j] + $ans[$i][$j - 1];


 We can see that in order to compute ans[i][j] we need to know ans[i – 1][j] and ans[i][j – 1]. So, we can visualize this as: we need the result of its previous row only i.e. we don’t need to know ans[i – 2][] when we compute ans[i][]. Therefore, we can compress the 2-D array into 1-D array, where we store the intermediate results of ans[i – 1] only. The space complexity is thus improved to O(y). With this modification, the loop sequence becomes important, you need to loop from the smaller index and the inner loop should be exactly from 1 to y, which accumulates the intermediate results. 


 这个时间复杂度是 O(xy) 而空间复杂度是 O(xy), 我们需要定义一个二维数组, 可是你看, 我们在算 ans[i][j] 的时候只用到了 ans[i] 和 ans[i – 1] 行的两个值, 也就是说我们并不需要用到 ans[i – 2], ans[i – 3] .. 更早的值, 所以我们完全可以用一维数组来保存上一行的值, 这样的话只需要 O(y) 数组就可以了. 


function work($x, $y) {


  $ans = array();


  for ($i = 0; $i <= $y; ++ $i) $ans[$i] = 1;


  for ($i = 1; $i <= $x; ++ $i) {


    for ($j = 1; $j <= $y ; ++ $j) {


      $ans[$j] += $ans[$j - 1]; 


    }


  }


  return $ans[$y];


}


 We initialize the array with answer 1’s which means ans[0][*] = 1 (with x = 0), by doing this, we also get rid of O(y) loop. This is the shortest, fastest and cleanest solution to this puzzle, as I believe :) 


 这么一修改 循环的顺序就变得格外的重要了, 因为内循环我们必须严格从1到 y 来累计中间结果. 这样一优化, 时间空间复杂度都达到最优了, 而且代码运行速度也最快了(就动规这个算法来讲), 代码也更简洁了. 



 Originally published at https://steemit.com Thank you for reading my post, feel free to FOLLOW and Upvote @justyy which motivates me to create more quality posts.


原创首发于 https://steemit.com 非常感谢阅读, 欢迎FOLLOW和Upvote @justyy  能激励我创作更多更好的内容.    


 // 同步到我的中文博客英文算法博客  



近期热贴 Recent Popular Posts 




This page is synchronized from the post: Software Engineer Interview Question – How to Improve Dynamic Programming Space Complexity? 进一步改进动态规化的空间复杂度

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×