字节跳动 第一、三题记录
1.关于产品经理转换成程序员问题.
对于任一产品经理,如果他的四方向邻域有程序员,则这次迭代他变成程序员.
最大迭代次数N=max(height , width ) .如果超过了最大迭代次数,cout << -1 << endl ;
注意数组越界问题。
注意这题的四方向探测在很多地方有用到,比方说图像处理里的拉普拉斯增强。曾经有一位同学因为拉普拉斯增强不会写丢了offer,这里我们把他批判一番.
3.关于跳柱子的问题.
一个人能够到达第N根柱子的充要条件是 他能到达第N-1根柱子,假设此时他的能量为En-1那么En = -Hn - 2*En-1 .
已知 EN = 0 , En-1 = (Hn + En)/ 2 .那么 E0 可以直接递推得出 , 注意向上取整 .
附第一题代码:
#include <iostream> #include <cstdio> #include <vector> using namespace std ;vector< vector< char > > input(){ char ch ; vector< vector< char > > ret ; while( 1 ){ vector< char > tmp_vec ; while( 1 ){ ch = getchar() ; if( ch == '\n' ) break ; if( ch == -1 ) return ret ; if( ch != ' ' && ch != '\n' ) tmp_vec.push_back( ch ) ; } ret.push_back( tmp_vec ) ; } return ret ; }bool isOK( vector< vector< char > > mat ){ for( int i = 0 ; i < mat.size() ; i++ ) for( int j = 0 ; j < mat[ i ].size() ; j++ ) if( mat[ i ][ j ] == '1' ) return false ; return true ; }vector< vector< char > > laplace( const vector< vector<char> >& mat ){ vector< vector< char > > ret = mat ;vector< pair< int , int > > direct ; direct.push_back( make_pair( -1 , 0 ) ) ; direct.push_back( make_pair( 0 , 1 ) ) ; direct.push_back( make_pair( 1 , 0 ) ) ; direct.push_back( make_pair( 0 , -1 ) ) ;for( int i = 0 ; i < mat.size() ; i++ ){ for( int j = 0 ; j < mat[ i ].size() ; j++ ){ bool flag = false ; for( int k = 0 ; k < direct.size() ; k++ ){ int x = i + direct[ k ].first ; int y = i + direct[ k ].second ;if( x < mat.size() && x >= 0 && y < mat[ i ].size() && y >=0 && mat[ x ][ y ] == '2' && mat[ i ][ i ] == '1' ) ret[ i ][ j ] = '2' ;} } }return ret ;}int main(){ vector< vector< char > > matrix = input() ; for( int i = 0 ; i < matrix.size() + 1 ; i++ ) { if( isOK( matrix ) ) { cout << i << endl ; return 0 ; } matrix = laplace( matrix ) ; }cout << -1 << endl ;}
#字节跳动##笔试题目#