自動運転アルゴリズム職場実習簡単面接


.Using c++ to write a queue. Need support function push(), pop()
答え:
#include 
#include 
using namespace std;

template 
struct Node{
    T value;
    Node *next;
    Node () {next =NULL;}

};


class MyQueue{

private:
    unsigned int num;
    Node * first;
    Node * last;


public:
    MyQueue();
    ~MyQueue();
    unsigned int size();
    void push();
    void pop();
    bool empty();
    T back();
    T front();
   
};
    
    

template 

MyQueue::MyQueue()
{
    num =0 ;
    first = NULL;
    last = NULL;
   

}


template 
MyQueue::~MyQueue()
{
    while(!empty())
    {
        pop();
    
    }

}

template 
unsigned int MyQueue::size()
{

    return num;

}

template 
void MyQueue::push(T ele)
{
    Node * tmp = new Node;
    tmp->next = NULL;
    tmp->value = ele;
    if(0==this->num)
    {
        first = tmp;
        last = tmp;
    
    
    }
    else
    
    {
        last ->next = tmp;
        last = tmp;
    }
    
    (this->num)++;
}


template 
void MyQueue::pop()
{
    if(0==this->num)
    {
        cout < * tmp =first;
        first = first->next;
        delete tmp;
        (this->num)--;
    }
   
}


template 
void MyQueue::back()
{
     if(0==this->num)
     {
         cout <value;
     }
    
}


template 
void MyQueue::front()
{
     if(0==this->num)
     {
         cout <value;
     }


}


 . Given a non-empty binary tree, find the minimum path sum.

   For this problem, a path is defined as any sequence of nodes 
   
   The path must contain at least one node and "does not need to go through the root".

   Input: [-10,9,20,null,null,15,7]

   -10
   / \
  9  -20
    /  \
   -15   7

Output: -45
----------
/*
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 

答え:
void minPathSum(TreeNode* root,int& left, int&right,int &minsum);


int minPathSum(TreeNode* root) {
    int  minsum = 0;
    int left,right;
    
    minPathSum(root, left, right, minsum);
    return minsum;


}


void minPathSum(TreeNode* root,int& left, int&right,int &minsum)
{
    if(root == NULL)
    {
    
        left = 0;
        right = 0;
        return;
        
    }
    
    int left1,right1,left2,right2;
    
    minPathSum(root->left,left1,right1,minsum);//left subtree
    minPathSum(root->right,left2,right2,minsum);//right subtree;
    
    
    left = root->val;
    
    right = root->val;
    
    if(max(left1,right1)>=0 &&max(left2,right2)>=0)
    {
    
        //start a new path
        minsum = min(root->val,minsum);
    }
    
    if(max(left1,right1)<0)
    {
    
        left = left + min(left1,right1);
        
    
    }
    
    
    if(max(left2,right2)<0)
    {
        right = right + min(left2,right2);
        
    }
    
    minsum = min(left+right+root->val,minsum);
    
  
}


/**
*         ...
*/


-----------
. Compare ORB feature to FAST
答え:
ORB = FAST + BRIEF

ORB        FAST        .

  FAST       ,         ,               。

FAST             ,               ,
      :                ,            。

        :
1.            p,       `lp`;
2.           T,  `0.3*lp`;
3.   p    ,        3    16        ;
4.          N        `lp+T`,    N        `lp-T`,    p       。
5.      ,           。

FAST           ,            ,            。
   ,ORB           。

ORB        FAST      ,   :

            R      ,                        。

BRIEF         ,                 。        :

1.          ,  n    `p(i),q(i)(i=1,2...,n)`;
2.            l,  `l[p(i)]>l[q(i)]`,        1,    0;
3.      ,            。

   n   128,256 512.

ORB     BRIEF     ,           ,      ,         。

      ORB             。

  FAST BRIEF       ,  ORB     SLAM    。


タイトル1:入力した浮動小数点数xに対して、√xの値を二分法で解く.
#DEFINE PREC 0.0001
float func1(float x)
{
if(x<=0)
{
return 0;
}
if(x=1)
{
return 1;
}
float begin = 0;
float end = x;
float middle =x/2;
while(middle*middle>x+PREC ||middle*middlex-PREC )
{
end = middle;//    ,     
}
}
return middle;


}

題目2:ひとつの環の上でN個人がいて、番号は0,1,2,3…N-1です.0から数え始め、Kに届いた人がアウトになったとき、残りの人は続けて報告します.全員がアウトになるまで、与えられたNとKに対して、順次アウトの番号が出力される.
//        ,    int  ,  print
int getnum(int N, int K)
{
if(N ==1)
{
return 1;
}
int out = (N+K-1)%N-1;

return (getnum(N-1,K)+K-1)%N+1;


}

int answer(int N, int K)
{
List lst;
for(int i = 0; i::iterator iter =  lst.begin();
while(lst.size()>1)
{
for(int i = 0 ; i::iterator iterdel =  iter ;
if(++iter==lst.end())
{
iter = lst.begin();
}
lst.erase(iterdel);

}

return *iter;

}
void func2(int N, int K)
{
if(N ==1)
{
cout<

题目3:正の整数が3つあるので、それらの间にプラスマイナス乗除で0が得られるかどうかを判断し、YESを出力することができ、そうでなければNOを出力することができる.//四則演算判断は0を得ることができますか?列挙しますか?再帰を使うかもしれませんが、考えられません...
void func3(int a, int b, int c)
{

if(a==b||a==c||b==c)
{
cout<