一小时内解决这五道编程题才配叫程序员

每次我发布软件工程师的岗位工作要求,各种求职申请就会纷至沓来,接踵而至。但每每让我困惑的是,似乎总有那么几位应聘者完全不明白所谓“编程”的意思。


当然,他们另有想法。


而我认为,如果你应聘的是“Web前端开发”岗位,那么你只懂jQuery也可以胜任,那么,“软件工程师”是不是就意味着会HTML、JavaScript和CSS这些必备技能就行了呢?


我觉得那些聊起XML、JSON、XSLT、SOAP、HTTP、REST、SSL和200多个首字母缩写词来头头是道,但却不会区分整型和浮点型数据类型的家伙很有意思。呵呵!

你真的会写代码吗?对于应聘程序员的求职人员,我,作为用人单位,首先希望的是你会写代码。我指的是真正的代码:我给你一个问题,你使用任何你觉得舒适的编程语言给出它的解决方案。


你真的能做到这一点吗?策略:如果你不能在1小时以内解决以下5个问题,那么你首先要做的是重新审视自己。的确,或许你各方面的工作都干的不错,但是我依然觉得你现在还不配“软件工程师(或程序员,计算机科学专家,甚至是“开发人员”)”这个头衔。不要自欺欺人,先花点时间来调整你的重点吧。


5个问题:

问题1

使用for循环、while循环和递归写出3个函数来计算给定数列的总和。


问题2

编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。


问题3

编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。


问题4

编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。


问题5

编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34–5 + 67–8 + 9 = 100。


如果你能力超群,上面这些问题对你而言只是小菜一碟,1小时之内解决完全绰绰有余的话,请将我的慷慨陈词当作是在放屁。


原文:Five programming problems every Software Engineer should be able to solve in less than 1 hour


问题1:

public static void main(String[] args) {
		int arr[] = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		System.out.println("for循环的总和为:" + getFor(arr));
		System.out.println("while循环的总和为:" + getWhile(arr));
		System.out.println("递归循环的总和为:" + getRecursion(0, arr));
	}

	// for循环
	public static int getFor(int[] arr) {
		// 总数
		int sum = 0;
		for (int i = 0; i < arr.length; i++) {
			sum += arr[i];
		}
		return sum;
	}

	// while循环
	public static int getWhile(int[] arr) {
		// 总数
		int sum = 0;
		// 开始值
		int i = 0;
		while (i < arr.length) {
			sum += arr[i];
			i++;
		}
		return sum;
	}

	// 递归
	private static int getRecursion(int i, int arr[]) {
		if (i < arr.length - 1)
			return arr[i] + getRecursion(i + 1, arr);
		else
			return arr[i];
	}


问题2:


public static void main(String[] args) {
		String[] arrstr = new String[] { "a", "b", "c" };
		String[] arrint = new String[] { "1", "2", "3" };
		String[] sum = split_joint(arrstr, arrint);
		for (int i = 0; i < sum.length; i++) {
			System.out.print(sum[i]);
		}
		System.out.println(sum[5]);

		for (int i = 0; i < sum.length; i++) {
			System.out.print(sum[i]);
		}
	}

	public static String[] split_joint(String arrstr[], String arrint[]) {
		String[] arrsum = new String[arrstr.length + arrint.length];
		// 新数组的下标
		int count = 0;
		for (int i = 0; i < 3; i++) {
			arrsum[count] = arrstr[i];
			count++;
			arrsum[count] = arrint[i];
			count++;
		}
		return arrsum;
	}

问题3:

public static void main(String[] args) {
		int arr[] = new int[10];
		for (int i = 0; i < arr.length; i++) {
			if (i == 0) {
				arr[i] = 0;
			} else if (i == 1) {
				arr[i] = 1;
			} else {
				arr[i] = arr[i - 1] + arr[i - 2];
			}
		}
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + ",");
		}
	}

问题4:

private static Integer[] VALUES = { 50, 2, 100, 99, 5, 7, 51, 50, 11 };
	private static Integer[] val = { 13,1312};

	public static void main(String[] args) {
		Arrays.sort(val, new Comparator<Object>() {
			@Override
			public int compare(Object lhs, Object rhs) {
				String v1 = lhs.toString();
				String v2 = rhs.toString();

				return (v1 + v2).compareTo(v2 + v1) * -1;
			}
		});

		String result = "";
		for (Integer integer : val) {
			result += integer.toString();
		}

		System.out.println(result);
	}

问题5:

private static int TARGET_SUM = 100;
    private static int[] VALUES = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    private static ArrayList add(int digit, String sign, ArrayList branches) {
        for (int i = 0; i < branches.size(); i++) {
            branches.set(i, digit + sign + branches.get(i));
        }

        return branches;
    }

    private static ArrayList f(int sum, int number, int index) {
        int digit = Math.abs(number % 10);
        if (index >= VALUES.length) {
            if (sum == number) {
                ArrayList result = new ArrayList();
                result.add(Integer.toString(digit));
                return result;
            } else {
                return new ArrayList();
            }
        }

        ArrayList branch1 = f(sum - number, VALUES[index], index + 1);
        ArrayList branch2 = f(sum - number, -VALUES[index], index + 1);

        int concatenatedNumber = number >= 0 ? 10 * number + VALUES[index] : 10
                * number - VALUES[index];
        ArrayList branch3 = f(sum, concatenatedNumber, index + 1);

        ArrayList results = new ArrayList();

        results.addAll(add(digit, "+", branch1));
        results.addAll(add(digit, "-", branch2));
        results.addAll(add(digit, "", branch3));

        return results;
    }

    public static void main(String[] args) {
        ArrayList list = f(TARGET_SUM, VALUES[0], 1);
        for(int i=0;i<list.size();i++)
        {            
            System.out.println(list.get(i));            
        }
    }




  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值