优秀的程序员10分钟内能搞定下面5个编程问题,你呢? - 开源中国社区
优秀的程序员10分钟内能搞定下面5个编程问题,你呢?
局长 2017年07月31日

优秀的程序员10分钟内能搞定下面5个编程问题,你呢?

局长 局长 发布于2017年07月31日 收藏 114

有免费的MySQL,为什么还要买? >>>  

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

当然,他们另有想法。

而我认为,如果你应聘的是“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小时之内解决完全绰绰有余的话,请将我的慷慨陈词当作是在放屁。

不过,如果你觉得本文对你很有帮助的话,欢迎分享,并留下您宝贵的见解。Thank for reading。

来自:代码湾

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:优秀的程序员10分钟内能搞定下面5个编程问题,你呢?
分享
评论(70)
精彩评论
34
......你哪个培训机构教编程基础的老师吗?
17
能给出答案的是优秀的程序员,但仅此而已。
知道茴香豆有四种写法的是孔乙己,不是状元郎。
优秀的程序设计者,首先要明白的是“我要做什么”,然后是”我能做什么“,最后才是”我要怎么做“。
有次面试,面试者非要我写出某个系统库类的名称,我笑着说”我不会,再见”!
11
......你哪个培训机构教编程基础的老师吗?
3
# 第5题python解法。
import itertools
inters = [1, 2, 3, 4, 5, 6, 7, 8, 9]
opters = ['+', '-', '']
all_opters = list(itertools.product(opters, repeat=len(inters) - 1)) # 从操作符中取出8个进行排列组合
outers = []
for all_opter in all_opters:
formula = ''.join(str(i) for i in (list(itertools.chain.from_iterable(zip(inters, all_opter))) + [inters[len(inters) - 1]]))
if int(eval(formula)) == 100:
outers.append(formula)
print(outers)
2

引用来自“HandMU”的评论

# 第5题python解法。
import itertools
inters = [1, 2, 3, 4, 5, 6, 7, 8, 9]
opters = ['+', '-', '']
all_opters = list(itertools.product(opters, repeat=len(inters) - 1)) # 从操作符中取出8个进行排列组合
outers = []
for all_opter in all_opters:
formula = ''.join(str(i) for i in (list(itertools.chain.from_iterable(zip(inters, all_opter))) + [inters[len(inters) - 1]]))
if int(eval(formula)) == 100:
outers.append(formula)
print(outers)
两点小建议:
1) all_opters 不需要转为 list
2)inters[len(inters) - 1] 直接写 inters[-1] 更简洁
最新评论
1
果然是在放屁,也许写出来能证明你逻辑思维很牛掰,但估计没有哪个公司会要你,因为她们根本不会去关心这狗屁的逻辑运算,而是希望你用最简单的代码写出它们想要的页面,仅此而已!
0
第四题,js写法
http://jsbin.com/pisiziriwa/edit?js,console,output
0
答出五道题,你可能是一位算法能力可以的程序员,但并不代表你有良好的业务逻辑能力吧?什么叫优秀的程序员?会算法?会多种编程语言写算法?不喜勿喷。一个刚入坑的小白
0
感觉我一个小时写不出来0.0
0
0

引用来自“unrealt84”的评论

第4题Java版,先转为String,再把String的compareTo拿过来改一下排个序就ok了,测试数据借用42楼的

  public static void main(String[] args) {
    int[] input = { 50, 2, 1, 90, 0, 640, 91, 9, 0, 65 };
    System.out.println(resolve(input));
  }

  public static Object resolve(int[] input) {
    List<String> list = new ArrayList<>();
    for (int val : input) {
      list.add(String.valueOf(val));
    }
    Collections.sort(list, new Comparator<String>() {

      @Override
      public int compare(String o1, String o2) {
        int len1 = o1.length();
        int len2 = o2.length();
        int lim = Math.min(len1, len2);
        char v1[] = o1.toCharArray();
        char v2[] = o2.toCharArray();

        int k = 0;
        while (k < lim) {
          char c1 = v1[k];
          char c2 = v2[k];
          if (c1 != c2) {
            return c2 - c1;
          }
          k++;
        }
        return len1 - len2;
      }

    });
    return list.stream().collect(Collectors.joining(""));
  }
数字改成字符串,相当于把人打死然后随意摆布然后再救活……
0
第4题Java版,先转为String,再把String的compareTo拿过来改一下排个序就ok了,测试数据借用42楼的

  public static void main(String[] args) {
    int[] input = { 50, 2, 1, 90, 0, 640, 91, 9, 0, 65 };
    System.out.println(resolve(input));
  }

  public static Object resolve(int[] input) {
    List<String> list = new ArrayList<>();
    for (int val : input) {
      list.add(String.valueOf(val));
    }
    Collections.sort(list, new Comparator<String>() {

      @Override
      public int compare(String o1, String o2) {
        int len1 = o1.length();
        int len2 = o2.length();
        int lim = Math.min(len1, len2);
        char v1[] = o1.toCharArray();
        char v2[] = o2.toCharArray();

        int k = 0;
        while (k < lim) {
          char c1 = v1[k];
          char c2 = v2[k];
          if (c1 != c2) {
            return c2 - c1;
          }
          k++;
        }
        return len1 - len2;
      }

    });
    return list.stream().collect(Collectors.joining(""));
  }
0
这些问题都答对有啥用?顶多是说明你学习不错!
0
说实话 ,真不难,都是基础算法问题
0

引用来自“HandMU”的评论

# 第5题python解法。
import itertools
inters = [1, 2, 3, 4, 5, 6, 7, 8, 9]
opters = ['+', '-', '']
all_opters = list(itertools.product(opters, repeat=len(inters) - 1)) # 从操作符中取出8个进行排列组合
outers = []
for all_opter in all_opters:
formula = ''.join(str(i) for i in (list(itertools.chain.from_iterable(zip(inters, all_opter))) + [inters[len(inters) - 1]]))
if int(eval(formula)) == 100:
outers.append(formula)
print(outers)

引用来自“滑车”的评论

两点小建议:
1) all_opters 不需要转为 list
2)inters[len(inters) - 1] 直接写 inters[-1] 更简洁
赞!~匆匆写的,刚入手python不久。
0
第5题 3^8才几千种可能性。暴力这个词都用不上。
递归或者直接复制8个for循环就可以了。
0
我不会啊,但是我做了安卓,网站后台啊。哈哈�� 基础不是这样证明的………
0
我能用五种语言来实现第一道题,但我就是不会去做这五道题!至于怎么区分整型和浮点型数据类型,在我的眼里,他们只是大小不同的内存空间而已!真想问一下你怎么区分的。还有问你个问题,什么叫内存地址对齐,怎么才算对齐!
0

引用来自“水涵”的评论

原来上开源中国的都是些低水平,突然好失望。
最难的是第三题,其他应该都能10分钟一遍过。
100项的那个数,你们可以查一下多少位。在自己没有写过高精度算法的情况下,1小时能写完都算厉害了。当年acm的题
python表示内存管够的话,多少位都不是问题
2

引用来自“HandMU”的评论

# 第5题python解法。
import itertools
inters = [1, 2, 3, 4, 5, 6, 7, 8, 9]
opters = ['+', '-', '']
all_opters = list(itertools.product(opters, repeat=len(inters) - 1)) # 从操作符中取出8个进行排列组合
outers = []
for all_opter in all_opters:
formula = ''.join(str(i) for i in (list(itertools.chain.from_iterable(zip(inters, all_opter))) + [inters[len(inters) - 1]]))
if int(eval(formula)) == 100:
outers.append(formula)
print(outers)
两点小建议:
1) all_opters 不需要转为 list
2)inters[len(inters) - 1] 直接写 inters[-1] 更简洁
0
有屌用?
0
第5题的暴力穷举
CmRlZiBzdHJfaXRlcih0cmd0LCBkZ3QsIHN5bWJsLCBmcm1sPScnLCBwcm10PUZhbHNlKToKICAgIGlmIG5vdCBkZ3Q6CiAgICAgICAgaWYgdHJndCA9PSBldmFsKGZybWwpOgogICAgICAgICAgICBwcmludChmcm1sKQogICAgZWxzZToKICAgICAgICBpZiBwcm10OgogICAgICAgICAgICBmb3IgcyBpbiBzeW1ibDoKICAgICAgICAgICAgICAgIHN0cl9pdGVyKHRyZ3QsIGRndCwgc3ltYmwsIGZybWwgKyBzKQogICAgICAgIHN0cl9pdGVyKHRyZ3QsIGRndFsxOl0sIHN5bWJsLCBmcm1sICsgZGd0WzBdLCBUcnVlKQoKc3RyX2l0ZXIoMTAwLCAnMTIzNDU2Nzg5JywgJy0rJykK
0

引用来自“Rezeroer”的评论

都是很简单的题

function q5(n,str){
if(n == 10 && eval(str) == 100){
log(str)
}else if(n==10){
void null
}else{
q5(n+1,str+n)
if(str == ''){
q5(n+1,str+n)
}else{
q5(n+1,str+'+'+n)
q5(n+1,str+'-'+n)
}
}
}

q5(1,'')


"123+45-67+8-9"
"123+4-5+67-89"
"123-45-67+89"
"123-4-5-6-7+8-9"
"12+3+4+5-6-7+89"
"12+3-4+5+67+8+9"
"12-3-4+5-6+7+89"
"1+23-4+56+7+8+9"
"1+23-4+5+6+78-9"
"1+2+34-5+67-8+9"
"1+2+3-4+5+6+78+9"
"123+45-67+8-9"
"123+4-5+67-89"
"123-45-67+89"
"123-4-5-6-7+8-9"
"12+3+4+5-6-7+89"
"12+3-4+5+67+8+9"
"12-3-4+5-6+7+89"
"1+23-4+56+7+8+9"
"1+23-4+5+6+78-9"
"1+2+34-5+67-8+9"
"1+2+3-4+5+6+78+9"
答复重复了一遍?
0
能写出来不算什么,能一次写对,就很牛逼了
0

引用来自“首席的哥队长”的评论

好吧,我要重新审视自己,顺便请大家也帮我审视下,最后一题怎么个解法?

引用来自“jarchan”的评论

最后一题可以理解为在1~9之间有8个插入点,在这8个插入点里插入+和-。
先决定在8个插入点里插多少个+,然后插在哪里,然后其他点都插入-。
所以这就变成了一个组合问题,搜索空间是C(8,0)+C(8,1)+C(8,2)+C(8,3)+...+C(8,8)=256。
其实也可以把8个插入点认为是8个bit,+代表1,-代表0,那么搜索空间=2^8=256。
所以你就可以这样做:
for (i=0; i<256; i++) {
// i转换成二进制表示
// 获得每个1的位置(1代表+)
// 获得每个0的位置(0代表-)
// 做加减计算判断是否等于100
}

引用来自“苍穹之镜”的评论

是不是少算了一种情况,你这样子能加到100?

引用来自“jarchan”的评论

少算了哪种情况?
还有不插入操作符,3^8种需要计算而不是2^8。
顶部