一道笔试题

今天去面试了一家外资公司,遇到一道笔试题

题目大概内容如下:

题目:判断邮箱地址是否为正确格式,如:aaa@foxmail.com;ABcd@sina.com.cn;
     邮箱中除了"@"和".",其余字符全为字母。不要使用正则表达式,写出思路或画出流程图

下面是我整理出来的代码:

 1 package com.b510.util;
 2 
 3 /**
 4  * 判断邮箱地址是否为正确格式,如:aaa@foxmail.com;ABcd@sina.com.cn; 邮箱中除了"@"和".",其余字符全为字母。
 5  * 
 6  * @author hongten
 7  * @date 3013-06-05
 8  * 
 9  */
10 public class CheckEmail {
11 
12     public static void main(String[] args) {
13         String email = "hongtenfoxmail.com.cn";
14         boolean isEmail = checkEmail(email);
15         String result = isEmail ? "正确" : "不正确";
16         System.out.println("邮箱 [" + email + "]格式是否正确:" + result);
17 
18     }
19 
20     /**
21      * 判断邮箱地址是否为正确格式,如:aaa@foxmail.com;ABcd@sina.com.cn; 邮箱中除了"@"和".",其余字符全为字母。
22      * 
23      * @param email
24      * @return
25      */
26     public static boolean checkEmail(String email) {
27         boolean indexFlag = false;
28         boolean lastFlag = false;
29         String[] strs = email.split("@");
30         System.out.println(strs.length);
31         // 之前代码为:<code>if (strs.length > 0 && strs.length <= 2) {</code>,谢谢
32         // <a href="http://home.cnblogs.com/u/535203/">钢板</a>提出的bug
33         if (email.lastIndexOf("@") != -1 && strs.length <= 2) {
34             String index = strs[0];
35             String last = strs[1];
36             indexFlag = isAllChars(index);
37             String[] lastArray = last.split("\\.");
38             for (int j = 0; j < lastArray.length; j++) {
39                 if (lastArray[j] == null || lastArray[j].equals("")) {
40                     // 说明有".foxmail...com."这种情况
41                     lastFlag = false;
42                     break;
43                 } else {
44                     lastFlag = isAllChars(lastArray[j]);
45                     if (!lastFlag) {
46                         break;
47                     }
48                 }
49             }
50             return (indexFlag && lastFlag);
51         } else {
52             return false;
53         }
54     }
55 
56     /**
57      * 判断一个字符串是否全为字母,此方法中,不管str中包含是否包含非字母字符,都会把str整个遍历
58      * 
59      * @param str
60      *            所需判断的字符串
61      * @return
62      */
63     public static boolean isAllChar(String str) {
64         if (str == null || str.equals("")) {
65             return false;
66         }
67         int j = 0;
68         for (int i = 0; i < str.length(); i++) {
69             if ((str.charAt(i) >= 'a' && str.charAt(i) <= 'z')
70                     || (str.charAt(i) >= 'A' && str.charAt(i) <= 'Z')) {
71                 j = j + 1;
72             }
73         }
74         return (j == str.length());
75     }
76 
77     /**
78      * 判断一个字符串是否全为字母,此方法比上面的isAllChar方法效率要高,但是需要的是str中包含非字母字符在靠前面
79      * 如:"a2bcd",对于这个字符串,到字符"2"的时候就会终止判断
80      * 
81      * @param str
82      *            所需判断的字符串
83      * @return
84      */
85     public static boolean isAllChars(String str) {
86         if (str == null || str.equals("")) {
87             return false;
88         }
89         boolean flag = true;
90         for (int i = 0; i < str.length(); i++) {
91             if ((str.charAt(i) < 'a' || str.charAt(i) > 'z')
92                     && (str.charAt(i) < 'A' || str.charAt(i) > 'Z')) {
93                 flag = false;
94                 break;
95             }
96         }
97         return flag;
98     }
99 }

运行结果:

邮箱 [hongten@foxmail.com]格式是否正确:正确
邮箱 [hongten@foxmail..com.]格式是否正确:不正确
邮箱 [h2ongten@foxmail.com]格式是否正确:不正确
邮箱 [hongten@foxma2il.com]格式是否正确:不正确
邮箱 [@foxmail.com]格式是否正确:不正确
邮箱 [hon.gten@foxmail.com]格式是否正确:不正确
邮箱 [hongten@foxmail.com.cn]格式是否正确:正确

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

通用的序列号生成器库

正如文章《通用的业务编号规则设计实现(附源码)》 文章里需要一个多实例和线程安全的序列化生成器,在SQL Server 2012+ 版本 有一个通过.NET程序...

20950
来自专栏JMCui

Redis学习一(基础入门).

一、前言     Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、key-Value 的数据库、并提供多...

39650
来自专栏LhWorld哥陪你聊算法

【机器学习】--FP-groupth算法从初始到应用

1、扫描事务数据库D 一次。收集频繁项的集合F 和它们的支持度。对F 按支持度降序排序,结果为频繁项表L。

19930
来自专栏向治洪

访问者模式

概念 访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 访问者模式的目的是封装一些施加于...

23250
来自专栏运维技术迷

连仕彤博客crayon-syntax-highlighter代码高亮插件Notice问题解决

15220
来自专栏偏前端工程师的驿站

Java魔法堂:类加载机制入了个门

一、前言                                 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序...

21870
来自专栏大闲人柴毛毛

提高Java代码质量的Eclipse插件之Checkstyle的使用详解

CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程,从而使得开发人员...

45690
来自专栏CDA数据分析师

工具 | 一些实用的 python 小建议

给dict设置默认值 这样能设置所有key的默认值为[],包括新添的key ? setdefault一次只能设置一个值,但好处是能使用链式语法,但default...

21050
来自专栏Vamei实验室

Python标准库10 多进程初步 (multiprocessing包)

我们已经见过了使用subprocess包来创建子进程,但这个包有两个很大的局限性:1) 我们总是让subprocess运行外部的程序,而不是运行一个Python...

21570
来自专栏皮皮之路

【JVM】浅谈双亲委派和破坏双亲委派

笔者曾经阅读过周志明的《深入理解Java虚拟机》这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践...

30820

扫码关注云+社区

领取腾讯云代金券