4.1 携程Java笔经

4.1日携程笔试,第一题SQL答案
 public static void main(String[] args) {
        // 测试用例
//        String[] str = {"select t.id, t.name, t.tag_id\n" +
//                "from (\n" +
//                "    select user.id, user.name, tag.tag_id\n" +
//                "    from user\n" +
//                "    inner join user_tag\n" +
//                ") t"};
////        System.out.println(Arrays.toString(str));
//        for (int i = 0; i < str.length; i++) {
//            System.out.println(i+": "+str[i]);
//        }
        String[] str = new String[50];
        String[] strings = multiInput(str);
        findTable(strings);
    }

    /**
     * 从完整的SQL语句中找到表名
     *
     * @param str
     */
    public static void findTable(String[] str) {
        // 1. 首先将字符串数组切割(按照from)
        String[] s = Arrays.toString(str).split("from");
        String[] s2 = Arrays.toString(str).split("inner join");
        String print = null;

        // 2. 判断from和inner join后面是( 还是表名
        for (int i = 1; i < s.length; i++) {
            // 打印所有的子串
//            System.out.println(i + ": " + s[i]);
            // 截取每一个子字符串
            String sub= s[i].substring(0, s[i].length() - 1);
            // 去除首尾空格
            String s1 = sub.trim();
//            System.out.println("起点" + s1 + "终点");
            // 按照空格截断每一个子串(先去除首尾的空格)
            String[] ss = s1.split(" ");
//            System.out.println(Arrays.toString(ss));
//            System.out.println(ss[0]);
            if (ss[0] != "("){
//                System.out.print(ss[0]);
                print = ss[0]+"\n";
            }
        }
        // 下面是inner join的部分
        for (int i = 1; i < s2.length; i++) {
            String sub2 = s2[i].substring(0,s2[i].length() - 1);
            String s11 = sub2.trim();
            String[] ss2 = s11.split(" ");
//            System.out.print(ss2[0]);
            print += ss2[0];
        }
        // 注意:这里记得清除带数组格式的","
        String s3 = print.replaceAll(",", "");
        System.out.println(s3);
    }

    public static String[] multiInput(String[] str){
        Scanner in = new Scanner(System.in);
        String[] strArr = str;
        int count = 0;
        for (int i = 0; i < 50; i++) {
            strArr[i] = in.nextLine();
            // 判断是否为两个换行
            if (strArr[i].replaceAll(" ", "").length() == 0) {
//                System.out.println(strArr[i]);
                count = i;
                break;
            }
        }
        // 4. 将数据整理成一组新的有效数组
        String[] strNew = new String[count];
        for (int i = 0; i < count; i++) {
            strNew[i] = strArr[i]+"\n";
        }
//        System.out.println(Arrays.toString(strNew));
        // 5. 转为字符串
//        StringBuffer stringBuffer = new StringBuffer(strNew.length);
//        for (int i = 0; i < strNew.length; i++) {
//            stringBuffer.append(strNew[i]);
//        }
//        System.out.println(stringBuffer.toString());
        return strNew;
    }
大家有兴趣可以跑下,另外吐槽下携程的两道hard真的难!

#笔经##携程#
全部评论
left join不行吗,我当时就想了在表名之前的很多,但是都没AC
点赞 回复 分享
发布于 2021-04-04 18:20

相关推荐

牛油果甜奶昔:别的先不说,牛客还能内推护士?
点赞 评论 收藏
分享
丿南烟丶:黑白模板吧,不要这样花哨的。 主要成就太空了,和获奖融在一起,写一两行就行了。 职业技能不要这样排,就传统的掌握精通什么什么然后举例补充的一些重要技术点。 自我介绍说实话也没啥用,可以删了。 把自己的两个项目方案细节补充上去,为什么这样设计,怎么设计,成果是什么按star法则来写 你要引导面试官来问你的技能和项目,你的获奖和自我介绍别人可能看都不看一眼或者不太在乎,重要的是展示你能干活的能力
点赞 评论 收藏
分享
评论
点赞
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务