查看: 1211| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 如何实现一个sum library

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
面试的时候遇到这么一道题,面试官给出题目由易到难,想看面试者对编程语言的了解。不能用自带的math库
1. 实现 sum(1, 2) , 输入两个变量,很简单,任何编程语言都可以, 直接返回 a + b
2. sum(1,2,...n) 输入变量不定长,用python 中的 * 加 looping 解决
3. sum(1)(2) 输入格式就是这样的, 用python lambda 匿名函数可解决
4. sum(1)(2)(3)..(n)卡在这了。。。 (自己google了一下 好像和Currying 有关, 但是不太懂)

假设我能答出第4题, 接下来会问什么? 欢迎讨论

上一篇:separate a string with given delimiters 除了用trie tree还能咋解?
下一篇:[拓扑排序]咨询一道FB的高频,非LC题,
推荐
magicsets 2020-2-26 16:56:49 | 只看该作者
全局:
本帖最后由 magicsets 于 2020-2-26 17:20 编辑

第四题可以这么写:

  1. import builtins

  2. class Sum:
  3.     def __init__(self, value):
  4.         self.value = int(value)

  5.     def __int__(self):
  6.         return self.value

  7.     def __call__(self, *args, **kwargs):
  8.         # 这里显式使用 builtin.sum 因为下面我们要重定义 sum
  9.         return Sum(self.value + builtins.sum([int(value) for value in args]))

  10.     def __repr__(self):
  11.         return str(self.value)

  12.     def __add__(self, other):
  13.         return Sum(self.value + Sum(other).value)


  14. sum = Sum(0)

  15. # 输出:15
  16. print(sum(1)(2)(3)(4)(5))

  17. # 输出:15
  18. print(sum(1, 2, 3)(4, 5))

  19. # 输出:15
  20. print(sum(1, sum(2)(3))(4, 5))


  21. s = sum(1)(2)(3)(4)

  22. # 输出:15
  23. print(s + 5)

  24. # 输出:20
  25. print(s + s)

  26. # 输出:20
  27. print(s(s))

  28. # 输出:30
  29. print(sum(s, s, s))

  30. # 输出:60
  31. print(sum(s(s), s(s(s)), s))
复制代码


但是python不支持自定义的隐式类型转换,所以扩展能力比较有限,上面只定义了加法,乘法(比如 s * s)就不行了






回复

使用道具 举报

🔗
magicsets 2020-2-26 17:19:09 | 只看该作者
全局:
C++就比较强大了,但是实际工程里尽量都是避免隐式类型转换的,除非是写非常能够增加productivity的库:

  1. #include <iostream>

  2. class Sum {
  3. public:
  4.   // 支持int隐式转换到Sum
  5.   Sum(int value) : value_(value) {}

  6.   // 支持Sum隐式转换到int
  7.   operator int() const { return value_; }

  8.   // 累加操作
  9.   template <typename... ArgTypes>
  10.   Sum operator()(ArgTypes... args) const {
  11.     return Sum(value_ + (... + args));
  12.   }

  13. private:
  14.   const int value_;
  15. };

  16. const Sum sum(0);

  17. int main(int argc, char* argv[]) {
  18.   // 输出:15
  19.   std::cout << sum(1)(2)(3)(4)(5) << "\n";

  20.   // 输出:15
  21.   std::cout << sum(1, 2, 3)(4, 5) << "\n";

  22.   // 输出:15
  23.   std::cout << sum(1, sum(2)(3))(4, 5) << "\n";

  24.   // 输出:54
  25.   std::cout << sum(1)(2)(3) * sum(4, 5) << "\n";

  26.   const auto s = sum(1)(2)(3)(4);

  27.   // 输出:10
  28.   std::cout << s << "\n";

  29.   // 输出:15
  30.   std::cout << s(5) << "\n";

  31.   // 输出:30
  32.   std::cout << s(s(s)) << "\n";

  33.   const int t = s;

  34.   // 输出:20
  35.   std::cout << s + t << "\n";

  36.   return 0;
  37. }
复制代码
回复

使用道具 举报

🔗
magicsets 2020-2-26 17:29:24 | 只看该作者
全局:
最后,接下来问的可以是functional programming,也可以是DSL(domain-specific language)—— 其中比较有深度的一类系统广义上叫做 LINQ (Language Integrated Query),比如说Pandas或者PySpark那套东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表