打卡ARTS-6

每周完成一个ARTS:

Algorithm:每周至少做一个 leetcode 的算法题

罗马数字包含以下七种字符: I, V, X, LCD 和 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         switch(roma_a[i].ctype){
        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

你可能感兴趣的:(打卡)