2019プログラミングインタビューの質問の概要

序文

コードはいくつかのアイデアで、比較のためのいくつかの根拠が確認されていない、問題や、より良い言葉遣い、歓迎のアドバイスを持っている場合。

バイト鼓動

トピック

リバースバイナリツリー

void Fun(Tree * node){
    if(node!=nullptr){
        Fun(node->left);
        Fun(node->right);
        
        Tree * temp = node->left;
        node->left = node->right;
        node->right = temp;
    }
}

米国のミッション

トピック

トラバーサルサイクルを達成するために
サイクル以下の万能薬です。

void Fun(Tree* node){
    stack<Tree *> trees;
    stack<bool> signs;
    
    trees.push(node);
    signs.push(false);
    
    while(trees.size()>0){
        Tree *tree = trees.top();
        bool sign = signs.top();
        
        trees.pop();
        signs.pop();
        
        if(tree!=nullptr){
            if(sign){
                cout<<tree->val<<endl;
            }else{
                //前序遍历
                //trees.push(tree->right);
                //trees.push(tree->left);
                //trees.push(tree);
                //signs.push(false);
                //signs.push(false);
                //signs.push(true);
                
                //中序遍历
                trees.push(tree->right);
                trees.push(tree);
                trees.push(tree->left);
                signs.push(false);
                signs.push(true);
                signs.push(false);
                
                //后序遍历
                //trees.push(tree->right);
                //trees.push(tree->left);
                //trees.push(tree);
                //signs.push(false);
                //signs.push(false);
                //signs.push(true);
            }
        }
    }
}

文へのインタビュアーの結果は、あなたがより多くのメモリのbool型の必要この方法は、それを達成するために余分なスペースなしで行うことはできませんか?

//中序遍历
void Fun(Tree *node){
    stack<Tree*> trees;
    trees.push(node);
    node = node->left;
    
    while(trees.size()>0){
        if(node!=nullptr){
            trees.push(node);
            node = node->left;
        }else{
            cout<<trees.top()->val<<endl;
            node = trees.top();
            trees.pop();
        }
    }
}

だから、前順トラバーサル、それの?

//前序遍历
void Fun(Tree *node){
    stack<Tree*> trees;
    trees.push(node);

    while(trees.size()>0){
        Tree *tree = trees.top();
        trees.pop();

        if(tree!=nullptr){
            cout<<tree->val<<endl;
            trees.push(tree->right);
            trees.push(tree->left);
        }
    }
}

だから、それを後順?後順は、一見、ハハ、万能薬にそれを行っていません。

猿のカウンセリング

トピック

ASCは、kビットの右に移動し、配列を持っています。

1 2 3 4    k=0
4 1 2 3    k=1
3 4 1 2    k=2
...

今、私たちはリストを知って、Kを返します。

//最简单的做法,找到那个不是升降排序的节点,返回即可
int Fun(vector<int> nums){
    for(int i=1;i<nums.size();++i){
        if(nums[i-1]>nums[i]){
            return i+1;
        }
    }
    return 0;
}

次いで、インタビュアーは、アルゴリズムの複雑さはO(N)であり、前記、全く簡単がありません。そこでは、半分を探します。

int Fun(vector<int> nums){
    //判断数组是否为空,且是否k=0;
    if(nums.size() == 0 || nums[0] < nums.back())
        return 0;
    
    int low=0;
    int high=nums.size()-1;
    
    while(low<high){
        int mid = (low + high) / 2;
        
        if(mid == low)
            break;
        
        if(nums[mid] > nums[low])
            low = mid;
        else if(nums[mid] < nums[high])
            high = mid;
    }
    
    return low;
}

トピック2

二分木のルートノードに2つのノードの値に、最小値は、それらの共通の親を見つけるために必要。たとえば、次の木:

D、F、最小の共通の親Aに
H、Eに、最小の共通の親B

struct Tree{
    int val;
    Tree *left;
    Tree *right;
};

Tree * Fun(Tree* node,int A,int B){
    if(node!=nullptr){
        if(node->val == A || node->val == B)
            return node;
        
        Tree *left = Fun(node->left,A,B);
        Tree *right= Fun(node->right,A,B);
        
        if(left!=nullptr&&right!=nullptr)
            return node;
        else if(left!=nullptr)
            return left;
        else if(right!=nullptr)
            return right;
    }
    return node;
}

トピック3

順不同リストは、奇数と偶数のチェーンにリストを要求するために昇順でパリティYaoanリスト中。

struct List{
    int val;
    List * next;
};

List* Insert(List* root,List* node){
    if(root == nullptr){
        node->next = nullptr;
        return node;
    }else if(node->val<root->val){
        node->next = root;
        return node;
    }
    
    root->next = Insert(root->next,node);
    return root;
}

void Fun(List *root){
    List * odd = nullptr;
    List * even = nullptr;
    
    while(root!=nullptr){
        List * node = root;
        root = root->next;
        if(node->val%2==1){
            odd = Insert(odd,node);
        }else{
            even = Insert(even, node);
        }
    }
}

テンセント

最初の質問

0と100と100の間の乱数を生成する方法を繰り返すことはできません。

void swap(int &x,int &y){
    int temp = x;
    x = y;
    y = temp;
}

void Fun(){
    vector<int> nums(100);
    //赋值
    for(int i=0;i<100;++i)
        nums[i] = i;
    
    //每次随机取一个数和最后面的数字进行交换
    for(int i=100;i>0;--i){
        int r = rand()%(i+1);
        swap(nums[r],nums[i-1]);
    }
}

2番目の質問

(アレイを乗じた)を乗算多数

vector<int> Fun(vector<int> num1,vector<int> num2){
    vector<int> num(num1.size()+num2.size());
    
    //先不考虑进位,把每位乘得的结果加到对应的位置上去
    for(int i=(int)num1.size()-1;i>=0;--i){
        int index = (int)num1.size()-i-1;
        
        for(int j=(int)num2.size()-1;j>=0;--j,++index){
            num[index]+=num1[i]*num2[j];
        }
    }
    
    //准备进位
    for(int i=0,sign=0;i<num.size();++i){
        num[i]+=sign;
        sign = num[i]/10;
        num[i] = num[i]%10;
    }
    
    //去掉多余的位数
    while(num.back()==0)
        num.pop_back();
    
    //反转
    reverse(num.begin(), num.end());
    
    return num;
}

クイック労働者

最初の質問

バイナリツリートラバーサルは、階層によって行われます。

void Fun(Tree * root){
    vector<Tree *> trees;
    trees.push_back(root);
    
    int index = 0;
    while(index<trees.size()){
        if(trees[index]!=nullptr){
            trees.push_back(trees[index]->left);
            trees.push_back(trees[index]->right);
        }
        
        ++index;
    }
    
    for(int i=0;i<trees.size();++i){
        if(trees[i] != nullptr){
            cout<<trees[i]->val<<" ";
        }
    }
}
公開された63元の記事 ウォン称賛73 ビュー70000 +

おすすめ

転載: blog.csdn.net/jjwwwww/article/details/100165968