zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    实验四(作业一:字符串加密)
    实验三“类和对象”动手动脑
    实验三“类和对象”课后作业(追踪已经创建了几个对象)
    递归实验动手动脑题目
    ("X+Y="+X+Y)与(X+Y+"=X+Y")
    Linq To Xml
    代码优先-Code First
    restFul接口设计规范
    四: 使用vue搭建网站前端页面
    三: vue组件开发及自动化工具vue-cli
  • 原文地址:https://www.cnblogs.com/littleLittleTiger/p/10356790.html
Copyright © 2011-2022 走看看