您的位置:首页 > 大数据 > 人工智能

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

2018-10-08 16:48 671 查看

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这个关键字😂

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: