简单面试算法题

1.①有未知字符串长度如”AAA&&BB”,以”&&”为分隔符,将字符串分割成字符串数组[“AAA”,”BB”]。(不能用系统分割符)

/* * 这种做法没有判断字符串最前面和最后面是否有"&&" */
public static void main(String[] args) {
    String strs = "AA&&BB&&CC";
    char[] chars = strs.toCharArray();
    List<String> strList = new ArrayList<String>();
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] == '&' && chars[i + 1] == '&') {
            i++;
            strList.add(builder.toString());
            builder = new StringBuilder();
            continue;
        }
        builder.append(chars[i]);
    }
    strList.add(builder.toString());
    int size = strList.size();
    String[] strLs = (String[]) strList.toArray(new String[size]);
    for (int i = 0; i < strLs.length; i++) {
        System.out.println(strLs[i]);
    }
}

②将数组[“AAA”,”BB”]合并成字符串”AAA&&BB”。

public static void main(String[] args) {
    String[] strs = new String[]{"AA","BB","CC"};
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < strs.length; i++) {
        if (i != 0) {
            builder.append("&&");
        }
        builder.append(strs[i]);
    }
    System.out.println(builder);
}

2.求出不大(小)于N的质数。
3.1000个范围在[0-999]的数,求出两个相同的数。

for (int i = 0; i < 1000; i++) {
    for (int j = i + 1; j < 1000; j++) {
        if (i != j && b[i] == a[i]) {
            System.out.println(b[i]);
            return;
        }
    }
}

4.有1.2…N个人围成一个圈报数,当报到M的时候出列。求剩下是哪个人?

public static void main(String[] args) {
        List<Integer> persons = new ArrayList<>();
        int M = 5; // 报数5出列
        for (int i = 0; i < 10; i++) {
            persons.add(i);
        }

        int j = 1; // 报数到N
        int i = 0; // 记录移除哪个
        boolean isFirst = true;
        while (true) {
            if (persons.size() == 1) {
                System.out.println(persons.get(0));
                return;
            }
            if (!isFirst) {
                i++;
                j++;
            }
            isFirst = false; // 第一次赋值不要自加
            if (persons.size() >= M) { // List大于M的时候用这里
                System.out.println(">M i=" + i + " ,j =" + j);
                if (j == M) {
                    persons.remove(i);
                    if (persons.size() != i) { // 上面移除了一条,所以会出现等于的情况
                    /* * 只有当不是最后一条的时候才需要减一 因为List删除一条会补回上去的,若是是最后一条的话 * 需要重置i,而不是减一 */
                    i--;
                } else {
                    /* * 本来重置应该是0的。但是在程序一开始的时候就加了1, 所以是为-1; */
                    i = -1;
                }
                j -= M;
            }
            if (i == persons.size()) {
                /* * 报到最后一个尾部的时候不够M个,要从头开始数过 当i == persons.size()的时候就是第一个了。 * 所以将i制为1 */
                i = 0;
            }
        } else { // List小于M的时候用这里
            System.out.println("--<M i=" + i + " ,j =" + j);
            if (i > persons.size() - 1) {
                i = 0;
            }
            if (j == M) { // j是从0开始数的
                persons.remove(i);
                j -= M;
            }
        }
    }
}

5.计算26个英文字母的组合算法。
6.判断一个数是否是回文数(12321、1245421等)

public static void main(String[] args) {
    char[] chars = new char[]{'1','2','3','2','1'};
    int size = chars.length;
    int tag = 0;
    for(int i = 0; i < size / 2; i++) {
        if (chars[i] == chars[size - i - 1]) {
            tag++;
        }
    }
    if (size % 2 == 0 && tag == size / 2) {
        System.out.println("it's true");
    } else if (size % 2 != 0 && tag == (size - 1) / 2) {
        System.out.println("it's true");
    } else {
        System.out.println("it's false");
    }
}

7.求出1000以内的完数。(6=1+2+3)

点赞