929. 独特的电子邮件地址

题目
每封电子邮件都由一个本地名称和一个域名组成,以 @ 符号分隔。

例如,在 alice@leetcode.com中, alice 是本地名称,而 leetcode.com 是域名。

除了小写字母,这些电子邮件还可能包含 ‘,’ 或 ‘+’。

如果在电子邮件地址的本地名称部分中的某些字符之间添加句点(’.’),则发往那里的邮件将会转发到本地名称中没有点的同一地址。例如,"alice.z@leetcode.com” 和 “alicez@leetcode.com” 会转发到同一电子邮件地址。 (请注意,此规则不适用于域名。)

如果在本地名称中添加加号(’+’),则会忽略第一个加号后面的所有内容。这允许过滤某些电子邮件,例如 m.y+name@email.com 将转发到 my@email.com。 (同样,此规则不适用于域名。)

可以同时使用这两个规则。

给定电子邮件列表 emails,我们会向列表中的每个地址发送一封电子邮件。实际收到邮件的不同地址有多少?

在这里插入图片描述

思路
@符号之前的.全部去掉,并且@符号之前的第一个+号及之后的全部不要;@符号之后的全部不变
代码

class Solution {
    public int numUniqueEmails(String[] emails) {
                int len=emails.length;
        char[] a=new char[100];
        int[] b=new int[len];
        String[] emails1=new String[len];
        int i=0;
        int j=0;
        int k=0;
        int sum=0;
        int sum1=0;
        int result=0;
        for(i=0;i<len;i++)
        {
            b[i]=i;
            sum=0;
            k=0;
            a=new char[100];
            for(j=0;j<emails[i].indexOf('@');j++)
            {
                if(emails[i].charAt(j)!='+'&&emails[i].charAt(j)!='.')
                {
                    a[j-sum]=emails[i].charAt(j);
                }
                else if(emails[i].charAt(j)=='.')
                {
                    sum++;
                }
                else if(emails[i].charAt(j)=='+')
                {
                    k=j;
                    break;
                }
                
            }
            for(j=emails[i].indexOf('@');j<emails[i].length();j++)
            {
                a[j-sum-emails[i].indexOf('@')+k]=emails[i].charAt(j);
            }
            emails1[i]=new String(a);
            
        }
        for(i=0;i<len;i++)
        {
            for(j=i+1;j<len;j++)
            {
                if(emails1[j].equals(emails1[i]))
                {
                    b[j]=b[i];
                    break;
                }
            }
        }
        for(i=0;i<len;i++)
        {
            
            for(j=i+1;j<len;j++)
            {
                if(b[j]==b[i])
                {
                    sum1++;
                    break;
                }
            }
        }
        return len-sum1;
    }
}

遇到的问题
1.char[] a=new char[100];用数组a来保存每次的新邮箱,因为是每次,所以数组要清空,不清空的话会导致数组后面多余的字符直接复制。其他计数变量也要从0开始。
2.返回len-sum1;我想的是应该返回len+1-sum1,一会再想一下

因为sum1一开始等于0;然后从第二个开始比,所以是len-sum1 如果sum1一开始等于1;就应该返回len+1-sum1

3.Java在线编译网站
https://www.tutorialspoint.com/compile_java_online.php
4.代码写的太不规范,感觉python比Java语言刷题时好用一点。
5.去掉.我是想用函数replace来写的,不知道为啥没有,想打死我自己
**

一开始用的语句emails1[i]=emails[i].replace(".","");但是这样域名后面的.也被替换掉了,借鉴了评论里的代码

while (emails1[i].matches(".\…@.*"))
{
emails1[i] = emails1[i].replaceFirst("\.", “”);
}
(已经去掉了+)

**
6.处理+应该用 replaceFirst函数,一会再改吧
**

emails1[i]=emails[i].replaceFirst("\+.*@","@");

自己写的语句,开心
然后是要注意特殊字符要用转义字符
http://www.runoob.com/java/java-regular-expressions.html
在这里插入图片描述
**
正则表达式

class Solution {
    public int numUniqueEmails(String[] emails) {
        int len=emails.length;
        char[] a=new char[100];
        int[] b=new int[len];
        String[] emails1=new String[len];
        int i=0;
        int j=0;
        int k=0;
        int sum=0;
        int sum1=0;
        int result=0;
        for(i=0;i<len;i++)
        {
            b[i]=i;
            //emails1[i]=emails[i].replace(".","");//这样的话域名的点也没有了
            emails1[i]=emails[i].replaceFirst("\\+.*@","@");//先去掉+号及以后的字符
            while (emails1[i].matches(".*\\..*@.*")) 
            { 
                emails1[i] = emails1[i].replaceFirst("\\.", "");
            }
            
        }
        for(i=0;i<len;i++)
        {
            for(j=i+1;j<len;j++)
            {
                if(emails1[j].equals(emails1[i]))
                {
                    b[j]=b[i];
                    break;
                }
            }
        }
        for(i=0;i<len;i++)
        {
            
            for(j=i+1;j<len;j++)
            {
                if(b[j]==b[i])
                {
                    sum1++;
                    break;
                }
            }
        }
        return len-sum1;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值