• 笔试算法题(16):二叉树深度计算 & 字符串全排列


    出题:要求判断二元树的深度(最长根节点到叶节点的路径);

    分析:二元递归不容易使用循环实现

    解题:

     1 struct Node {
     2         int value;
     3         Node *left;
     4         Node *right;
     5 };
     6 /**
     7  * 首先考虑递归结束条件
     8  * 然后考虑问题分解
     9  * 最后考虑问题合并
    10  * */
    11 int TreeDepth(Node *root) {
    12         if(root == NULL) return 0;
    13         int leftDepth=0;
    14         int rightDepth=0;
    15         if(root->left != NULL)
    16                 leftDepth=TreeDepth(root->left);
    17         if(root->right != NULL)
    18                 rightDepth=TreeDepth(root->right);
    19 
    20         if(leftDepth > rightDepth)
    21                 return leftDepth+1;
    22         else
    23                 return rightDepth+1;
    24 }

    出题:输入一个字符串,要求输出字符串中字符的所有排列与组合;

    分析:

    • 排列(所有元素组成的所有有序序列):建立正确的求排列组合的思维,一位一位的考虑则使用递归处理子序列,每一位有不同的交换方式则使用循环交换不同位置的元素,注意递归之后的还原。由于当前索引元素只与其之后的元素交换,所以不会引入重复;
    • 组合(不同元素组成的无序集合):组合问题可以转换成为每一个元素是否出现问题,则使用0/1状态表示元素的出现与否,然后整体框架与排列类似;

    解题:

     1 /**
     2  * 首先考虑递归结束条件:当index到达最后一个元素的时候
     3  * 说明可以输出一次序列
     4  * 然后考虑递归条件:将当前index指向的元素依次与array
     5  * 中index之后的元素交换,然后进行递归,递归之后需要
     6  * 将交换还原
     7  * */
     8 void arrange(char *array, int length, int index) {
     9         if(length == index+1) {
    10                 printf("
    ");
    11                 for(int i=0;i<length;i++)
    12                         printf("%c, ", array[i]);
    13                 printf("
    ");
    14         }
    15 
    16         int temp;
    17         for(int i=index;i<length;i++) {
    18                 temp=array[index];
    19                 array[index]=array[i];
    20                 array[i]=temp;
    21 
    22                 arrange(array,length, index+1);
    23 
    24                 temp=array[index];
    25                 array[index]=array[i];
    26                 array[i]=temp;
    27         }
    28 }
    29 void combination(char *array, bool *isShown, int length, int index) {
    30         if(length==index) {
    31                 printf("
    *");
    32                 for(int i=0;i<length;i++) {
    33                         if(isShown[i])
    34                                 printf("%c",array[i]);
    35                 }
    36                 return;
    37         }
    38 
    39         for(int i=0;i<2;i++) {
    40                 isShown[index]=i;
    41                 combination(array, isShown, length, index+1);
    42         }
    43 
    44 }
    45 int main() {
    46         char array1[]="abcd";
    47         char array2[]="abc";
    48         bool isShown[3];
    49         combination(array2, isShown, 3, 0);
    50         //arrange(array1,4,0);
    51         return 0;
    52 }
  • 相关阅读:
    Gin框架结合gorm实现mysql增删改查
    Gin框架安装使用
    Golang常用排序算法比较
    Golang获取时间戳及格式化
    Golang使用goroutine交替打印序列
    Golang基础编程(六)-并发编程
    Golang基础编程(五)-指针
    Golang基础编程(四)-Map(集合)、Slice(切片)、Range
    模块化前端开发入门指南(三)
    模块化前端开发入门指南(二)
  • 原文地址:https://www.cnblogs.com/leo-chen-2014/p/3740538.html
Copyright © 2020-2023  润新知