• 笔试算法题(02):N阶阶乘 & 双向循环链表实现


    出题:N阶阶乘问题的递归算法和非递归算法;

    分析:

    • 第一种解法:普通暴力解法的实现较为容易;
    • 第二种解法:stirling公式可快速给出近似解;

    解题:

     1 int Recursive(int s) {
     2         if(1 == s) {
     3                 return s;
     4         }
     5         return s*Recursive(s-1);
     6 }
     7 int NonRecursive(int s) {
     8         int temp=1;
     9         int result=1;
    10         while(temp<=s) {
    11                 result*=temp;
    12                 temp++;
    13         }
    14         return result;
    15 }
    16 int main() {
    17         int s=9;
    18         printf("recursive output: %d
    ",Recursive(s));
    19         printf("non-recursive output: %d",NonRecursive(s));
    20 }

    出题:双向循环链表的插入,查找与删除;

    分析:构造类的过程中需要进行的核查

    解题:

     1 #include <stdio.h>
     2 /**
     3  * 检查是否需要构造函数
     4  * 检查是否需要无参构造函数
     5  * 检查是否需要成员变量(函数)私有
     6  * 检查是否需要在使用成员初始化列表
     7  * 检查是否需要析构函数
     8  * 检查是否需要虚拟析构函数
     9  * 检查是否需要复制构造函数(参数为const)
    10  * 检查是否需要赋值重载函数(参数为const)
    11  *
    12  * */
    13 class Node {
    14 public:
    15         int value;
    16         Node *next;
    17         Node *last;
    18         Node(int v=0): next(NULL),last(NULL) {
    19 
    20         }
    21         ~Node() {
    22                 if(next!=NULL) delete next;
    23                 if(last!=NULL) delete last;
    24         }
    25 };
    26 class DDList {
    27 public:
    28         Node *head;
    29         DDList():head(new Node(0)) {
    30                 head->last=head;
    31                 head->next=head;
    32         }
    33         DDList(const DDList& target) {}
    34         DDList& operator=(const DDList& target) {}
    35         void insertN(int v) {
    36                 Node *newn=new Node(v);
    37                 Node *temp;
    38                 temp=head->next;
    39                 head->next=newn;
    40                 newn->next=temp;
    41                 newn->last=head;
    42                 temp->last=newn;
    43         }
    44         bool deleteN(int v) {
    45                 Node *target=queryN(v);
    46                 Node *temp;
    47                 if(target == NULL) return false;
    48                 temp=target->last;
    49                 temp->next=target->next;
    50                 target->next->last=temp;
    51                 delete target;
    52                 return true;
    53         }
    54         Node* queryN(int v) {
    55                 Node *temp=head->next;
    56                 while(temp != head) {
    57                         if(temp->value == v) return temp;
    58                         temp=temp->next;
    59                 }
    60                 return NULL;
    61         }
    62         void destroy() {
    63                 if(head->next == head) return;
    64                 deleteN(head->next->value);
    65         }
    66         void printList() {
    67                 Node *temp=head->next;
    68                 while(temp != head) {
    69                         printf("current point: %d",temp->value);
    70                         temp=temp->next;
    71                 }
    72         }
    73         ~DDList() {
    74                 if(head->last == head) delete head;
    75                 else destroy();
    76         }
    77 };
  • 相关阅读:
    Kubernetes学习之路(21)之网络模型和网络策略
    Kubernetes学习之路(16)之存储卷
    Kubernetes学习之路(18)之statefulset控制器
    Kubernetes学习之路(28)之镜像仓库Harbor部署
    Kubernetes学习之路(六)之创建K8S应用
    Kubernetes学习之路(十五)之Ingress和Ingress Controller
    nali一款linux下显示IP来源的小工具
    Redis 及RedisBloom 安装
    对java注解与反射的理解
    Java 8 stream的详细用法
  • 原文地址:https://www.cnblogs.com/leo-chen-2014/p/3730530.html
Copyright © 2020-2023  润新知