L1-011 A-B

题目:

 

这道题想着简单,但是过程比较坎坷。。。

一开始我先去帮助文档瞄了一眼,发现ArrayList有一个方法removeAll(Collection<?> c)可以直接删除指定集合中所包含的所有的元素。所以只要建立两个ArrayList,再removeAll就可以啦。

所以,一开始我是这么写的:

        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        String b=sc.nextLine();
        ArrayList goal = new ArrayList(Arrays.asList(s.toCharArray()));
        goal.removeAll(Arrays.asList(b.toCharArray()));
        for(int i=0;i<goal.size();i++)
        {
            System.out.print(goal.get(i));
        }

//插一句,Arrays包含用于操作数组的各种静态方法(如排序和搜索)。

但是运行结果如图:

打断点发现,goal的值永远都是[C@2b21cc40,不管最开始输入什么。这我就不太懂了,为什么把字符数组转换成ArrayList 会出现这样的问题?百度以后发现好像没人像这样转字符数组,都是直接转的字符串,像这样:ArrayList goal = new ArrayList(Arrays.asList(s.split("")));     所以我也这么试了一下,就成功了。但还是不懂为什么字符串数组就没问题,字符数组就这样。如果有幸有大佬看到这篇博文并且能帮忙解答一下的话那我请你喝奶茶好不好吖(◍•ᴗ•◍)~

 所以,本弱第一遍提交的代码是这样:

import java.util.*;
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        String b=sc.nextLine();
        ArrayList goal = new ArrayList(Arrays.asList(s.split("")));
        goal.removeAll(Arrays.asList(b.split("")));
        for(int i=0;i<goal.size();i++)
        {
            System.out.print(goal.get(i));
        }
    }
}

 

 然而。。。。并且我尝试了网上这题的其他java做法也是超时。。。

 

直到看到了柳婼大神的博客(https://blog.csdn.net/liuchuo/article/details/51988985)。。。照这个思路写了,却还是这两个测试点超时。。。可是时间复杂度已经由O(len(remove)*len(goal))变为O(len(remove)+len(goal))了啊!! 难道java注定不能AC吗??最终我把大神的C++代码给放上去,全部AC了。。。 果然Java不适合刷算法。。。然而我不会C++。。。用C需要自己造一些轮子,况且好久没用C了。。。而且编译器也没有eclipse舒服。。。不过可能到后面会考虑换吧。

下面附上依然超时的代码 TT:

import java.util.*;
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
        char []goal=s.toCharArray();
        String b=sc.nextLine();
        char []remove=b.toCharArray();
        int []book=new int[256];
        for(int i=0;i<remove.length;i++){
            book[remove[i]]=1;
        }
        for(int i=0;i<goal.length;i++)
        {
            if(book[goal[i]]==1)
            {
                continue;
            }
            System.out.print(goal[i]);
        }
    }
}

这个思路果然很巧妙,学习了。建立一个长度为256的整形数组代表0~255的ASCII码,在第二个字符串中出现了的ASCII码标记为1,最后只输出第一个字符串中ASCII的位置没有标记为1的字符。

 

 

 

--------------------------------------------------用C++洗心革面从新做人的分割线--------------------------------------------------------------

上代码:

#include <iostream>
using namespace std;
int book[256];
int main() {
    string s, a;
    getline(cin, s);
    getline(cin, a);
    for(int i = 0; i < a.length(); i++) {
        book[a[i]] = 1;
    }
    for(int i = 0; i < s.length(); i++) {
        if(book[s[i]] == 1) {
            continue;
        }
        cout << s[i];
    }
    return 0;
}

 

posted @ 2019-02-08 21:29  小泰格儿  阅读(479)  评论(0编辑  收藏  举报