京东2018校招研发笔试题记录

背景

这几天正好是各大互联网公司校招笔试的时间,于是陪着同学一起做了一下京东的笔试题。其中单选和不定项选择题涵盖的范围还是比较广的,包括子网掩码的计算、linux相关知识点、C++知识点、设计模式等。编程题有两道,其实难度不大,现在将第一题以及我的答案记录一下供大家参考。

题目描述:

给定一个字符串s,请计算输出含有连续两个s作为子串的最短字符串。注意两个s可能有重叠部分。例如,”ababa”含有两个aba。

输入描述:

输入包括一个字符串s,字符串长度length(1

输出描述:

输出一个字符串,即含有连续两个s作为子串的最短字符串。

输入:

abracadabra

输出:

abracadabracadabra

思路:

题目中说是包含两个s作为子串,而且可以有重叠部分。所以说,如果没有重叠的部分,最后输出的便是最长的字符串,即两个s拼接在一起。如果有重叠部分,也是仅限于s的前n位和s的后n位是一样的才可以。因此,我们可以用最简单的方式,把两个s当成s1和s2。从s1的第2(n)位往后开始和s2的第一位往后的每一个字符进行对比,如果直到s1的结尾都是一致的,则最后输出的字符便是s1的前1(n-1)个字符拼接s2。如果有不一致的,则从s1的第3(n+1)位开始重复比对,以此类推。

代码实现:

public class JDTest {
    public static void main(String[] args) {
        Scanner ss = new Scanner(System.in);
        String s = ss.next();
        System.out.println(getString(s));
    }
    public static String getString(String s) {
        char[] charArray = s.toCharArray();//将字符串s转为char数组
        for (int i = 1; i < charArray.length; i++) {
            //每次从s1的第i位与s2的第0位开始比较
            int j = 0;
            int tempi = i;
            //如果相等则继续比较s1和s2的下一位字符
            while (charArray[j] == charArray[tempi]) {
                //如果到了s1的最后一位都是相等的,则返回最短字符串
                if (tempi == charArray.length - 1) {
                    String result1 = s.substring(0, i);
                    return result1 + s;
                }
                j++;
                tempi++;
            }
        }
        //如果没有重复,则返回两个s拼接的字符串
        return s + s;
    }
}

当然,如果有更好的解决方法,希望各位读者可以补充交流。

最后庆祝我的独立域名博客正式上线啦

本篇文章也会在我的独立域名博客异思园同步发布,当然,在那个博客上也会发布一些和技术无关的瞎扯胡扯的文章啦,毕竟在CSDN博客上,还是主要写一些技术性的文章嘛(严肃脸)

你可能感兴趣的:(Java相关)