【筆試題精選】_5

在一個二維數組中,每一行都按照從左到右的順序排序,每一列都按照從上到下的順序排序。請實現一個函數用於判斷數組中是否包含指定的數。
函數原型: bool find_in_matrix(int matrix[N][M], int value);

說明: 查找成功時返回true, 返回失敗時返回false.
template<typename T, int N, int M>
bool find_in_matrix(T matrix[N][M], T value) // O(N + M)
{
    if( (matrix[0][0] <= value) && (value <= matrix[N-1][M-1]) )
    {
        int r = 0;
        int c = M - 1;
        
        while( (r < N) && (c >= 0) )
        {
            if( value == matrix[r][c] )
            {
                return true;
            }
            else if( value < matrix[r][c] )
            {
                c--;
            }
            else
            {
                r++;
            }
                
        }
    }
    
    return false;
}
寫一個函數,打印二叉樹中某層的全部節點
二叉樹節點定義:
struct Node
{
    int v;
    Node* left;
    Node* right;
};

函數原型: void print_node_at_level(Node* node, int level);

說明: 將 level 層的節點所保存的值打印在同一行
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);
        }
    }
}
void print_node_at_level_ex(Node* node, int level)
{
    if( node != NULL )
    {
        list<Node*> nl;
        list<int> ll;
        
        nl.push_back(node);
        ll.push_back(0);
        
        while( nl.size() > 0 )
        {
            Node* n = nl.front();
            int cl = ll.front();
            
            nl.pop_front();
            ll.pop_front();
            
            if( cl == level )
            {
                cout<<n->v<<" ";
            }
            else if( cl < level )
            {
                if( n->left != NULL )
                {
                    nl.push_back(n->left);
                    ll.push_back(cl+1);
                }
                
                if( n->right != NULL )
                {
                    nl.push_back(n->right);
                    ll.push_back(cl+1);
                }
            }
        }
    }
}

編寫一個函數用於刪除二叉樹中的度數爲 1 的全部節點
要求:節點刪除後其惟一的子節點代替它的位置
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);
        }
    }
}

clipboard.png

輸入一個數組,數組裏面可能有正數也有負數。數組中一個或連續的多個元素組成一個子數組。求全部子數組的和的最大值。
要求:
時間複雜度爲 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;
}
在一個整型數組中只可能有 0,1,2 三種數字重複出現,編寫一個函數對這樣的數組進行排序。
void swap(int& a, int& b)
{
    int c = a;
    a = b;
    b = c;
}
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++;
        }
    }
}
求 1 + 2 + 3 + ... + n 的和
要求:
不能使用 if, while, for, switch, ?: 等條件語句,不能使用 ==, !=, <=, >, <= 等比較運算符,也不能調用外部庫函數。
只能使用加減法操做操做符,不能使用乘除法操做符
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;
}
typedef int(Func)(int);

int end_func(int n);
int recusive_func(int n);

Func* Array[] = 
{
    end_func,     // 0
    recusive_func // 1
};

int end_func(int n)
{
    return n;
}

int recusive_func(int n)
{
    return n + Array[!!(n-1)](n-1);
}

int sum(int n)
{
    return recusive_func(n);
}

int main()
{
    cout<<sum(10)<<endl;
    cout<<sum(100)<<endl;
    
    return 0;
}
template<int N>
class Sum
{
public:
    static const int Value = N + Sum<N-1>::Value;
};

template<>
class Sum<0>
{
public:
    static const int Value = 0;
};

int main()
{
    cout<<Sum<10>::Value<<endl;
    cout<<Sum<100>::Value<<endl;
    
    return 0;
}
相關文章
相關標籤/搜索