C++笔试题深度分析 第五波 下

来源:互联网 发布:软件里程碑计划模板 编辑:程序博客网 时间:2024/05/24 03:44

2. 写一个函数,打印二叉树中某层的所有结点。
二叉树结点定义:
struct Node
{
int v;
Node* left;
Node* right;
};
函数原型:
void print_node_at_level(Node* node, int level)
说明:
将 level 层的结点中所保存的值打印在同一行。

#include <iostream>using namespace std;struct Node{int v;Node* left;Node * right;};void print_node_at_level(Node * node, int level){if(node != NULL){if(level == 0){cout<<node->v<<" ";}else{print_node_at_level(node->left,level -1);print_node_at_level(node->right,level -1);}}}int main(){Node nodes[] =    {        {0, NULL, NULL},        {1, NULL, NULL},        {2, NULL, NULL},        {3, NULL, NULL},        {4, NULL, NULL},        {5, NULL, NULL},        {6, NULL, NULL},        {7, NULL, NULL},    };        nodes[0].left  = &nodes[1];    nodes[0].right = &nodes[2];    nodes[1].left  = &nodes[3];    nodes[1].right = &nodes[4];    nodes[2].left  = &nodes[5];    nodes[2].right = NULL;    nodes[4].left  = &nodes[6];    nodes[4].right = &nodes[7];        print_node_at_level(nodes, 3);        cout<<endl;}


3. 编写一个函数用于删除二叉树中的度数为 1 的所有结点。
要求:
结点删除后其唯一的子结点替代它的位置。

#include <iostream>using namespace std;struct Node{    int v;    Node* left;    Node* right;};void print_div(int p){    for(int i=0; i<p; i++)    {        cout<<"-";    }}void print_tree(Node* node, int p){    if( node != NULL )    {        print_div(p);                cout<<node->v<<endl;                if( (node->left != NULL) || (node->right != NULL) )        {            print_tree(node->left, p+1);            print_tree(node->right, p+1);        }    }    else    {        print_div(p);                cout<<endl;    }}void print_tree(Node* node){    print_tree(node, 0);}void delete_one_degree_node(Node*& node){    if( node != NULL )    {        if( (node->left != NULL) && (node->right != NULL) )        {            delete_one_degree_node(node->left);            delete_one_degree_node(node->right);        }        else if( (node->left != NULL) && (node->right == NULL) )        {            node = node->left;                        delete_one_degree_node(node);        }        else if( (node->left == NULL) && (node->right != NULL) )        {            node = node->right;                        delete_one_degree_node(node);        }    }}int main(){Node n[10] = {0};Node* tree = n;for(int i=0; i<10; i++){    n[i].v = i;}tree[0].left = &tree[1];tree[0].right = &tree[2];tree[1].left = &tree[3];tree[1].right = &tree[4];tree[2].left = NULL;tree[2].right = &tree[6];tree[3].left = &tree[7];tree[3].right = &tree[8];tree[4].left = &tree[9];cout<<"Original:"<<endl;print_tree(tree);delete_one_degree_node(tree);cout<<"After:"<<endl;print_tree(tree);    return 0;}


 

4. 输入一个数组,数组里面可能有正数也有负数。数组中一个或连续的多个元素组成一个
子数组。求所有子数组的和的最大值。
要求:
时间复杂度为 O(n)。

 

解释:当前面的数字的和比后面的数字还小,就忽略前面的数字和

template<typename T>bool max_sub_array_sum(T array[], int len, T& max_sum){    int ret = (len > 0) && (array != NULL);        if( ret )    {        T sum = array[0];        T cur = array[0];                for(int i=1; i<len; i++)        {            cur = cur + array[i];                        if( cur < array[i] )            {                cur = array[i];            }                        if( cur > sum )            {                sum = cur;            }        }                max_sum = sum;    }        return ret;}


5. 在一个整型数组中只可能有 0,1,2 三种数字重复出现,编写一个函数对这样的数组进行
排序。

void three_element_sort(int array[], int len){    int* ts = new int[len];    int p = 0;        if( ts != NULL )    {        for(int i=0; i<3; i++)        {            for(int j=0; j<len; j++)            {                if( array[j] == i )                {                    ts[p++] = i;                }            }        }                for(int i=0; i<len; i++)        {            array[i] = ts[i];        }                delete[]ts;    }}void three_element_sort_ex(int array[], int len){    int p0 = 0;    int p2 = len - 1;        while( array[p0] == 0 ) p0++;    while( array[p2] == 2 ) p2--;        for(int i=p0; i<=p2;)    {        if( array[i] == 0 )        {            swap(array[i], array[p0++]);                        while( array[p0] == 0 ) p0++;                        if( i < p0 ) i = p0;        }        else if( array[i] == 2 )        {            swap(array[i], array[p2--]);                        while( array[p2] == 2 ) p2--;        }        else        {            i++;        }    }}


 

6. 求 1+2+3+…n 的和。
要求:
不能使用 if, while, for, switch, ?: 等条件语句,不能使用==, !=, <, <=, >, >=等比较运
算符,也不能调用外部库函数。只能使用加减法操作符,不能使用乘除法操作符。

#include <iostream>using namespace std;class Sum{private:    static int N;    static int S;    Sum();public:    static int Calculate(int n);};int Sum::N = 0;int Sum::S = 0;Sum::Sum(){    S = S + N;    N = N - 1;}int Sum::Calculate(int n){    int ret = 0;    Sum* p = NULL;            N = n;    S = 0;     p = new Sum[N];     ret = S;            delete[]p;        return ret;}int main(){    cout<<Sum::Calculate(10)<<endl;    cout<<Sum::Calculate(100)<<endl;    return 0;}


 

 

 

0 0
原创粉丝点击