LeetCode-Algorithms #007 Reverse Integer, Database #182 Duplicate Emails

Posted chang4

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode-Algorithms #007 Reverse Integer, Database #182 Duplicate Emails相关的知识,希望对你有一定的参考价值。

LeetCode-Algorithms #007 Reverse Integer

技术分享图片

给定一个32位整数, 将其各位反转并返回, 如果结果超出取值范围就返回0

 1 class Solution {
 2     public int reverse(int x) {
 3         //对原数取绝对值
 4         int y = Math.abs(x);
 5         //将原数转换为字符串
 6         String s1 = Integer.toString(y);
 7         //将字符串转换为字符数组
 8         char[] arr = s1.toCharArray();
 9         //反转数组
10         for (int i = 0; i < arr.length / 2; i++) {
11             char temp = arr[i];
12             arr[i] = arr[arr.length - 1 - i];
13             arr[arr.length - 1 - i] = temp;
14         }
15         //将反转后的字符数组拼接为字符串
16         StringBuilder sb = new StringBuilder();
17         for (char c : arr) {
18             sb.append(c);
19         }
20         String s2 = sb.toString();
21         //将新获得的字符串转换为整数
22         int res;
23         try {
24             res = Integer.parseInt(s2);
25         } catch (NumberFormatException e) {
26             return 0; //如果值超出了要求的范围,就返回0
27         }
28         //依据原数的正负值返回结果
29         return x < 0 ? res * -1 : res;
30     }
31 }

我这里的方法显然是取巧了, 先转换成字符串, 再反转字符串, 最后再转换回整数

技术分享图片

 

 结果还可以, 但是这种野路子方法不值得提倡, 重新考虑一下正经路数:

 1 public int reverse(int x) {
 2     //创建一个整数变量存储结果
 3     int ans = 0;
 4     //当x不等于0时循环
 5     while(x != 0) {
 6         //获取x的最末尾
 7         int i = x % 10;
 8         //去掉最末尾
 9         x /= 10;
10         //把获取到的最末位添加到结果中
11         ans = ans * 10 + i;
12     }
13     return ans;
14 }

核心是这样的, 但是光这样写没有办法避免超出取值范围时的问题, 因此再在循环中加一个选择条件

 1 class Solution {
 2     public int reverse(int x) {
 3         //创建一个整数变量存储结果
 4         int ans = 0;
 5         //当x不等于0时循环
 6         while(x != 0) {
 7             //获取x的最末尾
 8             int i = x % 10;
 9             //去掉最末尾
10             x /= 10;
11             //如果ans已经大于取值范围的十分之一, 直接使ans再增加一位会超出取值范围, 直接返回0
12             if(ans > Integer.MAX_VALUE / 10 || ans < Integer.MIN_VALUE / 10)return 0;
13             //否则就把获取到的最末位添加到结果中
14             ans = ans * 10 + i;
15         }
16         return ans;
17     }
18 }

这种写法其实和第一种速度相差不大, 但是比较接近题目本身的意思. 原本以为可能会有个别临界值会绕过选择条件, 后来琢磨了一下应该是不存在的, 当然, 为了健壮性也可以写成官方答案这样:

 1 class Solution {
 2     public int reverse(int x) {
 3         int rev = 0;
 4         while (x != 0) {
 5             int pop = x % 10;
 6             x /= 10;
 7             if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
 8             if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
 9             rev = rev * 10 + pop;
10         }
11         return rev;
12     }
13 }

 

 

 

LeetCode-Database #182 Duplicate Emails
技术分享图片

从给出的Person表中找出重复的Email

前几道数据库的题目基本都在用自联结解决, 习惯了之后总是第一时间想着用自联结:

SELECT DISTINCT p1.Email
FROM Person p1, Person p2
WHERE p1.Email = p2.Email
AND p1.Id <> p2.Id
;

但是这样实在是太慢了, 换一个思路, 用COUNT来做, 就快很多:

SELECT Email
FROM (
SELECT Email, COUNT(Email) AS num
FROM PERSON 
GROUP BY Email
) AS res
WHERE num > 1
;

再看看别人写的:

SELECT Email
FROM Person
GROUP BY Email
HAVING COUNT(Email) > 1
;

为什么我感觉自己都没见过HAVING这个关键字??


以上是关于LeetCode-Algorithms #007 Reverse Integer, Database #182 Duplicate Emails的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-algorithms-92. Reverse Linked List II

leetcode-algorithms-109. Convert Sorted List to Binary Search Tree

LeetCode-Algorithms 1. 两数之和

LeetCode-Algorithms #005 Longest Palindromic Substring, Database #179 Consecutive Numbers

LeetCode-Algorithms #001 Two Sum, Database #175 Combine Two Tables

LeetCode-Algorithms #003 Longest Substring Without Repeating Characters, Database #177 Nth Highest S