leetcode937-java

937. 重新排列日志文件

一个简单题让我做了将近一个小时去。。

你有一个日志数组 logs。每条日志都是以空格分隔的字串。

对于每条日志,其第一个字为字母数字标识符。然后,要么:

  • 标识符后面的每个字将仅由小写字母组成,或;
  • 标识符后面的每个字将仅由数字组成。

我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。

将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按字母顺序排序,忽略标识符,标识符仅用于表示关系。数字日志应该按原来的顺序排列。

返回日志的最终顺序。

 

示例 :

输入:["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]
输出:["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]

 

提示:

  1. 0 <= logs.length <= 100
  2. 3 <= logs[i].length <= 100
  3. logs[i] 保证有一个标识符,并且标识符后面有一个字。
class Solution {
    class MyString{
    String all;
    String part;
    public MyString(String all,String part){
        this.all=all;
        this.part=part;
    }
    
}
    public String[] reorderLogFiles(String[] logs) {
    String[]result=new String[logs.length];
        int count=0;
        List<String>numList=new ArrayList<String>();
        String before=null;
        String key=null;
        List<MyString>mystring=new ArrayList<MyString>();
        for(int i=0;i<logs.length;i++){
           String[]tmp=logs[i].split(" ");
            if(tmp[1].charAt(0)>='0'&&tmp[1].charAt(0)<='9')
                numList.add(logs[i]);
            else{
                String ch[]=logs[i].split(tmp[0]+" ");
               MyString str=new MyString(logs[i],ch[1]);
                mystring.add(str);
            }
            
        }
        int len=mystring.size();
       for(int i=0;i<len;i++){
           MyString str=mystring.get(0);
            key=mystring.get(0).all;
           before=mystring.get(0).part;
           
           for(int j=1;j<mystring.size();j++){
               //System.out.println(before);
              // System.out.println(mystring.get(j).part);
               //System.out.println(mystring.get(j).part.compareTo(before)>=0);
               if(mystring.get(j).part.compareTo(before)<0){
                   str=mystring.get(j);
                   key=mystring.get(j).all;
                   before=mystring.get(j).part;
               }
           }
           mystring.remove(str);
           result[count++]=key;
           
       }
        for(int i=0;i<numList.size();i++)
            result[count++]=numList.get(i);
        return result;
        
    }
}

 929. 独特的电子邮件地址

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

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

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

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

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

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

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

 

示例:

输入:["test.email+alex@leetcode.com","test.e.mail+bob.cathy@leetcode.com","testemail+david@lee.tcode.com"]
输出:2
解释:实际收到邮件的是 "testemail@leetcode.com" 和 "testemail@lee.tcode.com"。

 

提示:

  • 1 <= emails[i].length <= 100
  • 1 <= emails.length <= 100
  • 每封 emails[i] 都包含有且仅有一个 '@' 字符。
  public int numUniqueEmails(String[] emails) {
        Set<String>set=new HashSet<String>();
        for(int i=0;i<emails.length;i++){
            String[]tmp=emails[i].split("@");
            String yu=tmp[1];
            String name=tmp[0];
            String[]tmp2=name.split("/+");
            String nameFinal[]=tmp2[0].split(".");
            String re="";
            for(int j=0;j<nameFinal.length;j++)
                re+=nameFinal[j];
            re+=yu;
            if(!set.contains(re))
                set.add(re);
        }
        return set.size();
    }

思路很简单,就是用String效率很低

posted @ 2018-12-22 12:04  hui灰灰  阅读(340)  评论(0编辑  收藏  举报