Algorithm : 做一个 leetcode 的算法题

13. 罗马数字转整数

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值

I             1

V             5

X             10

L             50

C             100

D             500

M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。

X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。

C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内

示例 1:

输入: "III"

输出: 3

示例 2:

输入: "IV"

输出: 4

示例 3:

输入: "IX"

输出: 9

示例 4:

输入: "LVIII"

输出: 58

解释: L = 50, V= 5, III = 3.

示例 5:

输入: "MCMXCIV"

输出: 1994

解释: M = 1000, CM = 900, XC = 90, IV = 4.

  1. 解题思路:
  2.  
  3. 1.构建一个字典记录所有罗马数字子串,注意长度为2的子串记录的值是(实际值 - 子串内左边罗马数字代表的数值)
  4.  
  5. int RomanToInt(string s)
  6. {
  7. unordered_map<string, int> stMap = {{"I", 1}, {"IV", 3}, {"IX", 8}, {"V", 5}, {"X", 10},
  8. {"XL", 30}, {"XC", 80}, {"L", 50}, {"C", 100}, {"CD", 300}, {"CM", 800}, {"D", 500}, {"M", 1000}};
  9.  
  10. int iSum = stMap[s.substr(0, 1)];
  11.  
  12. for (int i = 1; i < (int)s.size(); i++)
  13. {
  14. string szOne = s.substr(i, 1);
  15. string szTwo = s.substr(i - 1, 2);
  16. iSum += stMap[szTwo] ? stMap[szTwo] : stMap[szOne];
  17. }
  18.  
  19. return iSum;
  20.  
  21. }

Review : 阅读并点评一篇英文技术文章

Guide to MySQL High Availability

Data is the currency of today's web, mobile, social, enterprise and cloud applications. Ensuring data is always available is a top priority for any organization - minutes of downtime will result in significant loss of revenue and reputation.

数据是当今网络、手机、社交、企业和云应用的货币;确保数据始终可用是任何组织首要的任务 -- 停机几分钟将导致收入和声誉严重的损失。

This Guide is designed to assist Developers, Architects and DBAs understanding, implementing and managing MySQL InnoDB Cluster, an integrated, native, HA solution for your MySQL databases.

Tips : 学习一个技术技巧

原文链接:https://zhuanlan.zhihu.com/p/36274119

C++一道深坑面试题:STL里sort算法用的是什么排序算法?

并非所有容器都使用sort算法

既然问的是STL的sort算法实现,那么先确认一个问题,哪些STL容器需要用到sort算法?
首先,关系型容器拥有自动排序功能(相对key值),因为底层采用RB-Tree,所以不需要用到sort算法。
其次,序列式容器中的stack、queue和priority-queue都有特定的出入口,不允许用户对元素排序。
剩下的vector、deque,适用sort算法。

实现逻辑

STL的sort算法,数据量大时采用QuickSort快排算法,分段归并排序。一旦分段后的数据量小于某个门槛(16),为避免QuickSort快排的递归调用带来过大的额外负荷,就改用Insertion Sort插入排序。如果递归层次过深,还会改用HeapSort堆排序

  1. 具体代码
  2. 源文件:/usr/include/c++/4.2.1/bits/stl_algo.h
  3.  
  4. template <class _RandomAccessIter, class _Compare>
  5. template <class _RandomAccessIter, class _Compare>
  6. inline void sort(_RandomAccessIter __first, _RandomAccessIter __last,
  7. _Compare __comp)
  8. {
  9. __STL_REQUIRES(_RandomAccessIter, _Mutable_RandomAccessIterator);
  10. __STL_BINARY_FUNCTION_CHECK(_Compare, bool,
  11. typename iterator_traits<_RandomAccessIter>::value_type,
  12. typename iterator_traits<_RandomAccessIter>::value_type);
  13. if (__first != __last)
  14. {
  15. // 快速排序 + 堆排序
  16. __introsort_loop(__first, __last,
  17. __VALUE_TYPE(__first),
  18. __lg(__last - __first) * 2,
  19. __comp);
  20.  
  21. // 插入排序(当排序个数 <= 16)
  22. __final_insertion_sort(__first, __last, __comp);
  23. }
  24. }
  25.  
  26. template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>
  27. void __introsort_loop(_RandomAccessIter __first,
  28. _RandomAccessIter __last, _Tp *,
  29. _Size __depth_limit, _Compare __comp)
  30. {
  31. // 当排序的数量大于16
  32. while (__last - __first > __stl_threshold)
  33. {
  34. // 递归深度为0时,调用堆排序
  35. if (__depth_limit == 0)
  36. {
  37. partial_sort(__first, __last, __last, __comp);
  38. return;
  39. }
  40.  
  41. --__depth_limit;
  42.  
  43. // 快速排序
  44. // 1.找基准元素
  45. _RandomAccessIter __cut =
  46. __unguarded_partition(__first, __last,
  47. _Tp(__median(*__first,
  48. *(__first + (__last - __first) / 2),
  49. *(__last - 1), __comp)),
  50. __comp);
  51.  
  52. // 分治思想:递归排序
  53. __introsort_loop(__cut, __last, (_Tp *)0, __depth_limit, __comp);
  54. __last = __cut;
  55. }
  56. }
  57.  
  58. // 堆排序
  59. template <class _RandomAccessIter, class _Tp, class _Compare>
  60. void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
  61. _RandomAccessIter __last, _Tp *, _Compare __comp)
  62. {
  63. make_heap(__first, __middle, __comp);
  64. for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
  65. if (__comp(*__i, *__first))
  66. __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
  67. __DISTANCE_TYPE(__first));
  68. sort_heap(__first, __middle, __comp);
  69. }
  70.  
  71. // 插入排序
  72. template <class _RandomAccessIter, class _Compare>
  73. void __final_insertion_sort(_RandomAccessIter __first,
  74. _RandomAccessIter __last, _Compare __comp)
  75. {
  76. if (__last - __first > __stl_threshold)
  77. {
  78. __insertion_sort(__first, __first + __stl_threshold, __comp);
  79. __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
  80. }
  81. else
  82. __insertion_sort(__first, __last, __comp);
  83. }
  84.  
  85. // 计算递归深度
  86. template <class _Size>
  87. inline _Size __lg(_Size __n)
  88. {
  89. _Size __k;
  90. for (__k = 0; __n != 1; __n >>= 1)
  91. ++__k;
  92. return __k;
  93. }

Share : 分享一篇有观点和思考的技术文章

原文链接:https://zentia.github.io/2018/09/21/TSF4G/

TBUS原理与实现,让程序忽略网路通信;

TBUS实现原理:

Tbus基于共享内存构建无锁双通循环消息队列,发送的双方通过专用的读写队列完成数据收发,实现本地进程或者远程进程间通信。通信双方使用的两个队列称之为tbus通道(channel),每一组通讯的双方就需要有一个tbus通道。

在同一台物理机通讯:

不同物理机之间的通信:

ARTS 第八周打卡的更多相关文章

  1. ARTS第八周

    1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的技术文章 以下是 ...

  2. ARTS 第十周打卡

    Algorithm : 做一个 leetcode 的算法题 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...

  3. ARTS第七周打卡

    Algorithm : 做一个 leetcode 的算法题 ////////////////////////////////////////////////////////////////////// ...

  4. ARTS第六周打卡

    Algorithm : 做一个 leetcode 的算法题 1.合并两个排序链表 2.树的子结构 3.二叉树的镜像 4.包含Min函数的栈 5.栈的压入.弹出 6.二叉搜索树的后序遍历 7.从上往下打 ...

  5. 第八周PSP

    团队项目PSP 一:表格     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论用户界面 8:40 11:40 35 60 70 分析与 ...

  6. Java第八周学习总结

    20145113第八周学习总结 第十五章学习内容 第15章比较琐碎,相对于之前章节也比较枯燥无味看了一部分,也动手敲了些 Logger logger = Logger.getLogger(" ...

  7. 补交作业-第八周PSP

    一.表格 C(分类) C(内容) S(开始时间) ST(结束时间) I(打断时间) △(净工作时间) 讨论 用户界面 9:30 10:40 15 55 编码 编码 13:20 16:30 10 180 ...

  8. 20145213《Java程序设计》第八周学习笔记

    20145213<Java程序设计>第八周学习笔记 教材学习内容总结 "桃花春欲尽,谷雨夜来收"谷雨节气的到来意味着寒潮天气的基本结束,气温回升加快.刚出冬的我对于这种 ...

  9. 20145304 Java第八周学习报告

    20145304<Java程序设计>第八周学习总结 教材学习内容总结 NIO NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区容量,在缓冲区中对感兴趣的数据区块进行标记 ...

随机推荐

  1. 关于解决ruby源码安装 gem install报错问题

    因做redis集群需要安装ruby,源码安装过后gem install redis安装redis接口报错 解决方案: 确保主机安装zlib,没有安装执行 yum -y install zlib zli ...

  2. C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值

    C++ 利用指针和数组实现一个函数返回多个值demo1 #include <iostream> using namespace std; int* test(int,int,int); i ...

  3. [Shell]CVE-2019-0708漏洞复现及修复补丁

    0x01 漏洞原理 Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广,windows2003.windows2008.windows2008 R2.windows 7 ...

  4. sql server 发布订阅

    [配置] 一. 发布方 复制 >> 如果有问题 C:\Windows\System32\drivers\etc hosts: 127.0.0.1 ?? 二. 订阅方 订阅方设置结束 三. ...

  5. NAT(地址转换技术)学习

    一.什么是NAT,NAT产生的背景 NAT通常部署在一个组织的网络出口位置,通过将内部网络IP地址替换为出口的IP地址提供公网可达性和上层协议的连接能力. NAT产生的背景是为了解决IPv4地址不足的 ...

  6. 手写实现RPC框架(不带注册中心和带注册中心两种)

    实现自己的RPC框架如果不需要自定义协议的话那就要基于Socket+序列化. ProcessorHandler:主要是用来处理客户端的请求. package dgb.nospring.myrpc; i ...

  7. Flutter移动电商实战 --(41)详细页_数据接口的调试

    建立数据模型层,我们的业务逻辑分开,然后进行后台数据的调试 生成model类 json数据: { "code": "0", "message" ...

  8. StringBuider类

    特点: 线程不安全的可变字符序列 ; 线程不安全对应的效率高 ; 用法同StringBuffer一致

  9. osg::Camera example

    #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include<iostream> #include <osgV ...

  10. Django之model.form创建select标签

    前言 之前我们学习了form表单验证用户输入格式和自动创建HTML,那么如果用户创建select标签时怎么办呢,先来看下这个东西: models.py 数据格式: class UserInfo(mod ...