算法笔记-第三章所有题目解

背景

最近在恶补数据结构和算法相关的知识,查询到一本比较好的书籍算法笔记,然后就开始学习了,学完第二章C/C++语言基础后,做了第三章的题目,虽然书上已经有题解了,但是还是想发表这篇文章,原因是通过记录下来我的学习过程,以提醒和鼓励自己。

第三章题解

#include <stdio.h>
#include <cstring>

int main() {

}

/**
 * 说反话
 * @return
 */
int reverseWords() {
    char strOri[80] = {};
    char words[40][80] = {};
    gets(strOri);
    int rowNum = 0;
    int colNum = 0;
    for (int i = 0; i < strlen(strOri); ++i) {
        //不是空格的就放入二维数组,直到遇到空格,改成下一行
        if (strOri[i] != ' ') {
            words[rowNum][colNum] = strOri[i];
            colNum++;
        } else {
            rowNum++;
            colNum = 0;
        }
    }

    //倒叙输出二维数组的单词
    for (int i = rowNum; i >= 0; i--) {
        printf("%s ", words[i]);
    }
}

/**
 * 判断回环字符串
 * @return
 */
int loopback() {
    char str[256] = {};
    scanf("%s", str);

    int length = strlen(str);

    for (int i = 0; i < length / 2; ++i) {
        if (str[i] != str[length - i - 1]) {
            printf("%s", "NO");
            return 0;
        }
    }
    printf("%s", "YES");
    return 0;
}

/**
 * 进制转换
 * @return
 */
int baseChange() {
    //a,b<= 2^30 -1,1<n<=10
    //a+b<= 2^31 -2
    //int 范围:2^31-1,所以a+b可以用int来接收
    int a, b, d;
    scanf("%d%d%d", &a, &b, &d);
    int sum = a + b;
    int resultNumber[32] = {0};
    //除基取余
    int i = 0;
    for (;; ++i) {
        resultNumber[i] = sum % d;
        if (sum / d == 0) {
            break;
        }
        sum = sum / d;
    }

    for (int j = i; j >= 0; j--) {
        printf("%d", resultNumber[j]);
    }
    return 0;
}

/**
 * 日期计算器
 * @return
 */
int dateCal() {
    int date1, date2;
    scanf("%d%d", &date1, &date2);
    if (date1 > date2) {
        int tmp = date1;
        date1 = date2;
        date2 = tmp;
    }

    int yy1 = date1 / 10000, mm1 = date1 % 10000 / 100, dd1 = date1 % 100;
    int yy2 = date2 / 10000, mm2 = date2 % 10000 / 100, dd2 = date2 % 100;


    //第一个日期不断加N天,直到等于第二个日期
    int n = 0;
    while (true) {
        //构建新日期串
        dd1 = dd1 + 1;

        int ddlast = 0;
        bool is31 = mm1 % 2 == 1 || mm1 == 8;
        if (is31) {
            ddlast = 31;
        } else if (mm1 == 2) {
            //判断是否闰年
            bool isRun = (yy1 % 4 == 0 && yy1 % 100 != 0) || (yy1 % 400 == 0) ? true : false;
            if (isRun) {
                ddlast = 29;
            } else {
                ddlast = 28;
            }
        } else {
            ddlast = 30;
        }

        if (dd1 > ddlast) {
            dd1 = 1;
            mm1 = mm1 + 1;
        }

        if (mm1 > 12) {
            mm1 = 1;
            yy1 = yy1 + 1;
        }

        if (!(dd1 == dd2 && mm1 == mm2 && yy1 == yy2)) {
            n += 1;
        } else {
            break;
        }
    }
    printf("%d", n + 2);
    return 0;
}

上一篇:java中Date日期类型的大小比较


下一篇:.NET程序设计实验2