美文网首页
算法训练2

算法训练2

作者: jeckHao | 来源:发表于2018-03-27 10:52 被阅读0次
1、请实现一个函数,把字符串中的每个空格替换成“%20”,例如,输入“we are happy”,则输出“we%20are%20happy”。
/********************** 字符串 **********************/
#include <string.h>
#include <stdlib.h>
void replaceBlank(char string[]) {
    int length = (int)strlen(string);
    int i = 0, blankNum = 0;
    while (string[i] != '\0') {
        if (string[i] == ' ') {
            blankNum ++;
        }
        i++;
    }
    int newLength = length + blankNum * 2;
    printf("%d,%d\n",blankNum,newLength);
    if (newLength > length) {
        char *newString = realloc(string, newLength);
        if (newString == NULL) {
            return;
        }else{
            string = newString;
        }
    }
    int index_new = newLength, index_old = length;
    while (index_new > index_old && index_old >= 0) {
        //从后往前走
        if (string[index_old] != ' ') {
            string[index_new--] = string[index_old];
        }else{
            string[index_new--] = '0';
            string[index_new--] = '2';
            string[index_new--] = '%';
        }
        index_old --;
    }
}
/********************** 字符串 **********************/
int main(int argc, const char * argv[]) {
    char *str = (char *)malloc(18);
    strcpy(str, "hello world happy.");
    replaceBlank(str);
    printf("str替换后的结果为:%s\n",str);
    return 0;
}
思路如下: 字符串.png
2、输入一个链表的头结点,从尾到头反过来打印出每个节点的值。

利用栈的先进后出原则,做以下操作。

/********************** 链表-栈 **********************/
struct ListNode {
    int m_nKey;
    struct ListNode *m_pNext;
};   //链表
void PrintListNode(struct ListNode *pHead) {
    std::stack<ListNode *> nodes;
    ListNode *pNode = pHead;
    while (pNode != NULL) {
        nodes.push(pNode);  //入栈操作
        pNode = pNode -> m_pNext;
    }
    while (!nodes.enpty()) {
        pNode = nodes.top();
        printf("%d\t",pNode -> m_nKey);     //打印栈顶
        nodes.pop();    //出栈操作
    }
}
/********************** 链表-栈 **********************/

因为栈的本质是递归,所以,我们也可以利用递归进行操作。

/********************** 链表-递归 **********************/
struct ListNode {
    int m_nKey;
    struct ListNode *m_pNext;
};
void PrintListNode(struct ListNode *pHead) {
    if (pHead != NULL) {
        if (pHead -> m_pNext != NULL) {
            PrintListNode(pHead -> m_pNext);
        }
        printf("%d\t",pHead -> m_nKey);
    }
}
//缺点:当链表很长的时候,调用层级太深,从而导致调用函数栈溢出。
/********************** 链表-递归 **********************/
3、给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。

思路:假设要删除I结点,找到I结点的下一个结点J,将J的内容复制给I,将I的m_pNext指向J,然后删除J。
有两个特殊情况,1、删除的I结点是链表的尾结点,需要从头到尾循环找到前结点,将前结点的m_pNext指向NULL; 2、链表只有一个结点,即I结点,删除I结点后,将链表头部结点指向NULL

/********************** 链表 **********************/
struct ListNode {
    int m_nKey;
    struct ListNode *m_pNext;
};   //链表

void deleteNode(struct ListNode **pListHead, struct ListNode *pToBeDelete) {
    if (pListHead == NULL || pToBeDelete == NULL) {
        return;
    }
    //要删除的结点在链表中间
    if (pToBeDelete -> m_pNext != NULL) {
        struct ListNode *node = pToBeDelete -> m_pNext;
        pToBeDelete -> m_nKey = node -> m_nKey;
        pToBeDelete -> m_pNext = node -> m_pNext;
        delete node;
        node = NULL;
    }
    //链表中只有一个结点的时候,删除I结点后,将链表头部结点指向NULL
    else if (*pListHead == pToBeDelete) {
        delete pToBeDelete;
        pToBeDelete = NULL;
        *pListHead = NULL;
    }
    //要删除的结点在链表尾部,需要从头到尾循环找到前结点,将前结点的m_pNext指向NULL
    else {
        struct ListNode *node = *pListHead;
        while (node -> m_pNext != pToBeDelete) {
            node = node -> m_pNext;
        }
        node -> m_pNext = NULL;
        delete pToBeDelete;
        pToBeDelete = NULL;
    }
}
/********************** 链表 **********************/

相关文章

  • 算法训练2

    题目描述:一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],...

  • 算法训练2

    1、请实现一个函数,把字符串中的每个空格替换成“%20”,例如,输入“we are happy”,则输出“we%2...

  • 【NO.1】KNN-算法

    KNN(K-nearest-neighbor)-K最近邻算法 1、算法简介 1)已知训练样本(分类); 2)对测试...

  • 第六章 更多监督训练

    介绍Lunar Lander示例 监督训练没有训练集 使用遗传算法 使用模拟退火算法 遗传算法和模拟退火算法的训练...

  • 02-25:NN/word2vec算法

    NN/word2vec算法 NN:神经网络 word2vec算法其实是基于训练数据构建一个神经网络 input o...

  • diploSHIC使用案例

    在有监督的机器学习的常规工作流程中,创建一个训练集,使用该集训练算法,验证训练后算法的准确性,然后最终将训练后算法...

  • 《B站西瓜书白话》-笔记2

    2、模型评估与选择 2.1、一种训练一种算法 2.1.1 经验误差与过拟合(简述)2.1.2 评估方法【训练集验证...

  • 机器学习实战

    1、机器学习基础 2、kNN近邻算法 是分类数据最简单有效的算法。缺点:训练数据集很大的时候必须使用大量存储空间,...

  • 0x02_特征工程(上)

    算法的形成需要 大量数据,对于训练算法的数据,对其有一定的要求。 1、数据数量/大小分布合理; 2、去除“重复”数...

  • Spark计算基础知识

    算法、模型的理解1.算法+训练数据才能跑出模型2.模型的呈现形式是一些视觉不可读的文件,可以生成多个版本。3.算法...

网友评论

      本文标题:算法训练2

      本文链接:https://www.haomeiwen.com/subject/etioqftx.html