某公司面试笔试题目(在线

笔编程题两个

1.用冒泡算法实现整数数组排序,

2.实现一个计算器可以计算加减乘除

要求是考虑程序的健壮性

冒泡排序:

比较相邻两个数的大小,如果前者比后者大,则交换两者。

先来一个最简单的例子 3,2,1

对[0,2]区间内相邻的数进行冒泡操作, 3和2交换位置,3和1交换位置 2,1,3

对[0,1]区间内相邻的数进行冒泡操作,2和1交换位置, 1,2,3

对[0,0]区间内相邻的数进行冒泡操作,右端点到0,结束。

外循环: 区间的右端点r从len-1逐渐减小到0,

内循环: 对[0,r]内相邻的数进行冒泡操作。 j由0->r-1,比较item[j] 和 item[j+1]的大小

public class Sort {

    public static void main(String[] args) {
        int[] itmes = new int[]{3,2,1} ;
        sort(itmes);
        System.out.println();

    }


    public static void sort(int[] items) {
        int length = items.length;
        for (int r = length - 1; r > 0; r--) {
            for (int j = 0; j <= r - 1; j++) {
                if (items[j] > items[j + 1]) {
                    int tmp = items[j + 1];
                    items[j + 1] = items[j];
                    items[j] = tmp;
                }
            }
        }
    }
}

稳定性: 稳定

时间复杂度O(N^2)

空间复杂度O(1)

第二道题目:

分析: + - * / ( ) 0-9

1+2 (1,2,+) 对1和2进行加操作运算

1+2*3+2 ((1,(2,3,*),+) ,2,+)

1+2*(1-2) (1,(2,(1,2,-),*),+)

采用两个栈(stack),一个栈(dataStack) 存在数值,一个栈(operatorStack)存放操作符号。

关于数值的解析: 从正负号开始||从数字开始,直到遇到操作符结束 || 表达式结束

关于正负号的识别:

第0个字符可以是正负号

-1+1 中的第0个字符是负号

(后可以接正负号

1-(-2-3)中的 数字2前面的字符是负号

即遇到操作符时,前面可能一个数值,我们需要将此数值压入dataStack

遇到操作符号进行的处理:

判断该操作符号是否需要压入栈中

需要压入栈中的情况:

1:operatorStack为空

2:符号本身为(, 或者栈顶元素为(

3:本符号的优先级比栈顶元素的优先级高 (乘除高于加减)

其他的情况:

如果符号为")"

如 (1+2*3) 弹出*号,2和3做乘法, 再弹出+号,1和6做加法,弹出"(" , 结束

另外一种情况:

1+2*3 + 2

* 优先级高于+ 2*3 先计算

+ 优先级高于 + 1+6 先计算

操作栈顶元素的优先级比本符号的优先级高,那么弹出栈顶的操作符

异常情况分析:

1:1(2, 1a2 操作符号不是加减乘除符号)

2: 1++2 +++ 计算时缺数字

3:(1+2 1+2) 括号未正常关闭

4:除数不能为0

5: +++ (++ 会导致解析数字异常

遗憾, 后两种异常未处理。

正常结束 dataStack的size为1, operatorStack的size为0.

import java.util.Stack;

public class ExpressEval {

    public static void main(String[] args) {

        //  -123 + 345 ;

        String test = "9/7/1";
        int result = eval(test);
        System.out.println(result);

    }


    public static int eval(String input) {


        Stack<Integer> dataStack = new Stack<>();
        Stack<Character> operatorStack = new Stack<>();

        // assert input 不为空
        char[] items = input.toCharArray();
        int length = items.length;

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < length; i++) {

            char item = items[i];
            if ((item == '+' || item == '-') && (i == 0 || items[i - 1] == '(')) {
                sb.append(item);
            } else if (item <= '9' && item >= '0') {
                sb.append(item);
            } else {

                if (sb.length() > 0) {
                    int number = parseInt(sb);
                    dataStack.push(number);
                    sb = new StringBuilder();
                }


                if (operatorStack.empty()) {
                    if (item == ')') {
                        throw new IllegalArgumentException("非法表达式");
                    }
                    operatorStack.push(item);
                } else {

                    char top = operatorStack.peek();
                    if (item == '(' || top == '(') {
                        operatorStack.push(item);
                    } else if (item == ')') {

                        for (; ; ) {

                            if (operatorStack.empty()) {
                                throw new IllegalArgumentException("非法表达式,未找到与之匹配的(");
                            }

                            char operator = operatorStack.pop();
                            if (operator == '(') {
                                break;
                            }

                            int tmp = cal(dataStack, operator);
                            dataStack.push(tmp);
                        }

                    } else if ((item == '*' || item == '/') && (top == '+' || top == '-')) {
                        operatorStack.push(item);
                    } else {

                        while (!operatorStack.empty()) {

                            top = operatorStack.peek();
                            if (top == '(') {
                                break;
                            }
                            if (youxian(top, item)) {
                                operatorStack.pop();
                                int tmp = cal(dataStack, top);
                                dataStack.push(tmp);
                            } else {
                                break;
                            }
                        }

                        operatorStack.push(item);
                    }
                }
            }
        }


        if (sb.length() > 0) {
            dataStack.push(parseInt(sb));
        }


        while (!operatorStack.empty()) {
            char op = operatorStack.pop();
            int tmp = cal(dataStack, op);
            dataStack.push(tmp);
        }


        if (dataStack.size() != 1 || operatorStack.size() != 0) {
            throw new IllegalArgumentException("非法表达式");
        }

        return dataStack.pop();
    }


    public static boolean youxian(char top, char current) {
        if ((current == '+' || current == '-') || (top == '*' || top == '/')) {
            return true;
        }
        return false;
    }


    public static int cal(Stack<Integer> data, char operator) {

        if (data.size() < 2 || !(operator == '+' || operator == '-' || operator == '*' || operator == '/')) {
            throw new IllegalArgumentException("表达式非法");
        }

        int data2 = data.pop();
        int data1 = data.pop();

        if (operator == '+') {
            return data1 + data2;
        } else if (operator == '-') {
            return data1 - data2;
        } else if (operator == '*') {
            return data1 * data2;
        } else {
            return data1 / data2;
        }

    }


    public static int parseInt(StringBuilder sb) {

        if (sb.length() == 1 && (sb.charAt(0) == '+' || sb.charAt(0) == '-')) {
            throw new IllegalArgumentException("表达式非法");
        }

        try {
            return Integer.parseInt(sb.toString());
        } catch (Exception e) {
            throw new IllegalArgumentException("解析整数抛出了异常");
        }

    }
}

#面试题目#
全部评论
美好的一天从做题开始
点赞 回复
分享
发布于 2023-03-27 12:27 山东
笔试没有通过,代码有问题 如11+(+11) 无法处理, 应该将item == ')' 放在 item == '(' 前面进行处理,任何时候不要洋洋得意。还是应该提前认真准备。
点赞 回复
分享
发布于 2023-03-28 21:28 北京
滴滴
校招火热招聘中
官网直投

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务