• leetcode编程框架——在IDE上模拟leetcode环境


    1、为什么写这个

    为了用IDE!,这样不同的大题,复制粘贴就完事,真正帮你节约大把时间来思考题目。

    import sys
    
    # 这里写解决问题的代码,和LeetCode就完全一样了
    def solve(arr):
     pass
    
    
    if __name__ == '__main__':
    
     # 接收输入的逻辑,这里先把输入接收过来, 两种选择input()和sys.stdin.readline()
     group_nums = input()   #字符串形式,得转成int
     
     group_nums = int(group_nums)
     
     # 对于每一组
     for i in range(group_nums):
      # 接收每一组的输入, 这里不同的题目就不一样了,但一定记住我们接收的还是一行,这是一个字符串
      arr = sys.stdin.readline().strip().split(' ')
      # 元素转成int
      arr = list(map(int, arr))
      # 输入接收过来之后,这里最好打印下看看接收的是不是正确,这个很重要
      # print(arr)
      # 处理具体的问题了
      res = solve(arr)
      # 输出结果
      print(res) 
    

      上面这个模板,处理的是多组输入,或者多行输入;如果是一组输入,仅仅几行的话, 就不用外层for循环的, 一行行的接收即可。

    2、框架模板的优势

      这个框架做到了主函数与处理问题的逻辑分离开。接收输入 -> 处理函数 -> 调整输出即可。 这么一来,我们在solve里就可以像在LeetCode上一样,直接写解决问题的函数。这样的代码看起来清晰,找bug时也好找。

    3、框架模板的注意点

      逻辑通了,下面是细节上要注意的。首先是,接收输入时都是一行一行地接收,这个是字符串形式,要先接收过来,再转换格式。我个人习惯是先都接收了,然后统一转换格式,比较清晰。只要保证接收正确,大家也可以在接收时直接转。

      这里主要整理接收intput()sys.stdin.readline()两种方式的区别。这两个都是字符串格式,读入一行,区别是后者会带着一个换行符 。啥意思?我们在输入时,是把输入输完之后,敲一个回车告诉编译器我敲完了。这俩的区别就是input()会过滤掉最后的回车,而sys.stdin.readline()会带着后面的回车。

    一个最简单的例子:

    arr = sys.stdin.readline().split(' ')
    print(arr)    # ['1', '2', '3', '4', '5
    ']
    
    arr = input().split(' ')
    #arr = sys.stdin.readline().split(' ')
    print(arr)      # ['1', '2', '3', '4', '5']
    

      可以发现,如果用上面那个代码,接收的输入可能是不正确的。比如,有时用下面这个代码把每个元素转成int时,会出现一些不知名的错误:

    list(map(int ,arr))
    

      所以,如果想用sys接收输入的话,更加鲁棒性的代码是:

    arr = sys.stdin.readline().strip().split(' ')
    

      也就是加一个strip函数去掉多余的空格或者换行符。还有一种鲁棒性的写法:

    arr = input().strip().split(' ')
    

      这两个写法都可以, 建议用input。

    同样的输出也有两种方式:

    # sys.stdout.write(''.join(arr))
    # print(''.join(arr))
    

      这俩的区别是sys的那种,最后不会加一个换行,而print我们知道,输出完毕之后,会自动加一个换行符。建议还是print吧,花里胡哨的多了,就容易出错。

       有了这样的一个框架,就把ACM模式转成了我们常用的LeetCode模式了。

    参考资料

    笔试编程框架总结!

  • 相关阅读:
    PChar,PAnsiChar,String,AnsiString,Char数组,AnsiChar数组转换
    Property ClientHeight does not exist 问题解决
    单调栈求笛卡尔树
    luogu4294 [WC2008]游览计划(状压DP/斯坦纳树)
    luogu4074 [WC2013]糖果公园(树上带修莫队)
    loj6570 毛毛虫计数(生成函数FFT)
    CF1097D Makoto and a Blackboard(期望)
    CF600E Lomsat gelral(线段树合并)
    luogu4383 [八省联考2018]林克卡特树(带权二分+dp)
    51nod1847 奇怪的数学题 (Min_25筛+第二类斯特林数)
  • 原文地址:https://www.cnblogs.com/noticeable/p/14781363.html
Copyright © 2020-2023  润新知