每周完成一个ARTS:
Algorithm:每周至少做一个 leetcode 的算法题
罗马数字包含以下七种字符: 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:
输入: 3 输出: "III"
示例 2:
输入: 4 输出: "IV"
示例 3:
输入: 9 输出: "IX"
示例 4:
输入: 58 输出: "LVIII" 解释: L = 50, V = 5, III = 3.
示例 5:
输入: 1994 输出: "MCMXCIV" 解释: M = 1000, CM = 900, XC = 90, IV = 4.
解法一:
char * copy_n(char * dst,char *src, int num){
int i = 0;
int len = strlen(src);
int dlen = strlen(dst);
dst = dst + dlen;
for(i = 0;i < num;i++){
strncat(dst, src, len);
}
return dst;
}
void f_t1_cal(int *num, int p, char * romoastr)
{
int bit = (*num) / p;
(*num) = (*num) - bit * p;
copy_n(romoa, romoastr, bit);
}
void f_t2_cal(int *num, int p, char * romoastr){
num = num - p;
copy_n(romoa, romoastr, 1);
}
char* intToRoman(int num) {
static char romoa_save[128]="";
char *romoa = romoa_save;
int bit = 0;
if(num < 1 || num > 3999){
return NULL;
}
romoa[0] = '\0'; //reset romoa buf
if(num>=1000){
bit = num / 1000;
num = num - bit * 1000;
copy_n(romoa, "M", bit);
f_t1_cal
}
if(num >= 900 && num < 1000){
num = num - 900;
copy_n(romoa, "CM", 1);
}
if(num >= 500 && num < 900){
num = num - 500;
copy_n(romoa, "D", 1);
}
if(num >= 400 && num < 500){
num = num - 400;
copy_n(romoa, "CD", 1);
}
if(num >= 100 && num < 400){
bit = num / 100;
num = num - bit * 100;
copy_n(romoa, "C", bit);
}
if(num >=90 && num < 100){
num = num - 90;
copy_n(romoa, "XC", 1);
}
if(num >=50 && num < 90){
num = num - 50;
copy_n(romoa, "L", 1);
}
if(num >=40 && num <50){
num = num - 40;
copy_n(romoa, "XL", 1);
}
if(num >=10 && num <40){
bit = num / 10;
num = num - bit * 10;
copy_n(romoa, "X", bit);
}
if(num >=9 && num <10){
num = num - 9;
copy_n(romoa, "IX", 1);
}
if(num >=5 && num <9){
num = num - 5;
copy_n(romoa, "V", 1);
}
if(num >=4 && num <5){
num = num - 4;
copy_n(romoa, "IV", 1);
}
if(num >=1 && num <4){
copy_n(romoa, "I", num);
//printf("romoa =%d\n\n", num);
//printf("romoa =%s\n\n", romoa);
}
return romoa;
}
解法二:typedef struct __roma_t{
char *name;
int ctype;
int start;
int end;
}roma_t;
roma_t roma_a[]=
{
{"I", 1, 1, 4},
{"IV", 2, 4, 5},
{"V", 2, 5, 9},
{"IX", 2, 9, 10},
{"X", 1, 10, 40},
{"XL", 2, 40, 50},
{"L", 2, 50, 90},
{"XC", 2, 90, 100},
{"C", 1, 100, 400},
{"CD", 2, 400, 500},
{"D", 2, 500, 900},
{"CM", 2, 900, 1000},
{"M", 1, 1000, 4000}
};
char * copy_n(char * dst,char *src, int num){
int i = 0;
int len = strlen(src);
int dlen = strlen(dst);
dst = dst + dlen;
for(i = 0;i < num;i++){
strncat(dst, src, len);
}
return dst;
}
static inline void f_t1_cal(char * dst, int *num, int p, char * romoastr)
{
if(num <=0)
return;
int bit = (*num) / p;
(*num) = (*num) - bit * p;
copy_n(dst, romoastr, bit);
}
static inline void f_t2_cal(char * dst, int *num, int p, char * romoastr){
if(num <=0)
return;
(*num) = (*num) - p;
copy_n(dst, romoastr, 1);
}
char* intToRoman(int num) {
int i = 0;
static char romoa_save[128]="";
char *romoa = romoa_save;
int bit = 0;
if(num < 1 || num > 3999){
return NULL;
}
romoa[0] = '\0'; //reset romoa buf
for(i = ((sizeof(roma_a)/(sizeof(roma_t))) -1); i>=0;i--){
if(num >= roma_a[i].start && num
case 1:
{
//printf("romoa 1:%s, %d, %d, %s\n", romoa, num, roma_a[i].start, roma_a[i].name);
f_t1_cal(romoa, &num, roma_a[i].start, roma_a[i].name);
break;
}
case 2:
{
f_t2_cal(romoa, &num, roma_a[i].start, roma_a[i].name);
//printf("romoa 2:%s, %d, %d, %s\n", romoa, num, roma_a[i].start, roma_a[i].name);
break;
}
default:
{
printf("error type\n");
exit(-1);
}
}
}
return romoa;
}
Review:阅读并点评至少一篇英文技术文章
http://hongchao.me/living-and-working-in-sweden-as-engineers/
听过很多去国外,新加坡,美国工作的例子,无非就是生活,工作;其实本人看法是修炼内功,不管是国内还是国外,我们总会满足一种生活,总会撑起自己的技术追求,总会承担起自己的责任;
Tip:学习至少一个技术技巧
ed流编辑器是现在很多编辑器的祖先,包含vim,sed,awk,gawk等等。
sed和awk是其中用于流式处理优秀的命令;通过sed可以实现在一个或多个文件实现自动化编辑,简化对多个文件执行相同的编辑处理工作,编写转换程序的;
通过awk将文本看做由记录和字段组成的文本数据库,使用变量操作数据库,使用算数和字符串操作符。使用普通的程序设计结构,例如循环和条件;生成格式化的报告;定义函数。从脚本中执行UNIX命令,处理UNIX命令的结果;
Share :分享一篇有观点和思考的技术文章;
什么是真正的程序员,小故事,有深意;https://www.cnblogs.com/xueweihan/p/5220513.html