面试题新
Posted zhihuanzzh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题新相关的知识,希望对你有一定的参考价值。
23年5月31日
1、装饰器是什么
1.装饰器是什么
装饰器的本质是闭包【函数】
2.装饰器的作用
在不改变程序源代码和调用方式的基础上,为程序增加新功能
3.装饰器的本质
被装饰以后,在执行被装饰的函数,其实执行不是之前的函数了,所有才加入了新功能
4.装饰器的语法糖
语法糖 @ python的特殊语法,它有特殊作用----》把被装饰的函数(装饰器下面的函数),当参数传入装饰器,并把装饰器的执行结果赋值给被装饰的函数
2、python深浅拷贝是什么
浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。
深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联。
3、模仿方法new和init有什么区别
1.__init__
类名加括号 给对象添加独有数据时自动触发
2.__new__
类在创建对象的时候是用魔法方法——双下new,产生空对象。
4、python的可变和不可变数据类型是什么
可变数据类是数据值发生改变,其内存地址不变
不可变数据是,数据值发生改变,其内存地址一定发生改变
可变数据类型有字典,列表,集合,文件对象
不可变数据类型有,整型,小数型,字符串,元组,布尔
5、什么是生成器,有什么应用场景
生成器是程序员在函数内部写的有vield关键字的函数
应用场景:比如说在进行文件操作时,如果文件过大,一次性打开,会占用过多内存空间可能会造成内存溢出,使用生成器用多少拿多少,减少内存消耗
23年4月3日
1、数据库三大范式是什么
参考:https://zhuanlan.zhihu.com/p/618012849
1、第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据线;也就是说:每列的值具有原子性,不可再分割。
解释:
学籍信息可以继续分割,所以不符合1NF
2、第二范式(2NF)是在第一范式(1NF)的基础上建立起来得,满足第二范式(2NF)必须先满足第一范式(1NF)。如果表是单主键,那么主键以外的列必须完全依赖于主键;如果表是复合主键,那么主键以外的列必须完全依赖于主键,不能仅依赖主键的一部分。
解释:
学生id和课程id联合主键,非主键列【分数】完全依赖于主键【学生id和课程id】,学生id和课程id两个值才能决定score的值
但是【课程名字】只依赖于课程id,与学生id没有依赖关系,它不完全依赖于主键,只依赖于主键的一部分,不符合2NF
3、第三范式(3NF)是在第二范式的基础上建立起来的,即满足第三范式必须要先满足第二范式。第三范式(3NF)要求:表中的非主键列必须和主键直接相关而不能间接相关;也就是说:非主键列之间不能相关依赖。
解释:
表中【部门名称】依赖于【部门id】,而【部门id】依赖于【id主键】,从而推出【部门名称】依赖于id(主键)
【部门名称】不直接依赖于主键,而是通过依赖于非主键列而依赖于主键,属于传递依赖,不符合3NF
2、mysql有哪些索引类型,分别有什么作用
什么是索引?
索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。
索引的作用
1)索引就好比一本书的目录,它能让你更快的找到自己想要的内容
2)让获取的数据更有目的性,从而提高数据库检索数据的性能
索引的本质:加快查询
mysql的索引类型
聚簇索引,聚集索引,主键索引,主键,如果不存在主键,隐藏一个主键,构建聚簇索引 primary(key)
辅助索引,普通索引 index
唯一索引 unique
联合索引,组合索引,多列索引:unique_to
3、事务的特性(ACID)和隔离级别
事务的四大特性
- A:原子性
指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。
- C:一致性
指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。一致性与原子性是密切相关的。
- I:隔离性
指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间(多个事务之间彼此不干扰)。
- D:持久性
持久性也称永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,并不会被回滚。
事务的隔离级别
1.read uncommitted(未提交读)
2.read committed(提交读)
3.repeatable read(可重复读) # MySQL默认隔离级别
4.serializable(可串行读)
老题新做,再战津津
又把一道很水的题来出来做了,就是2004年提高组津津的题,之前刚学循环的时候,一直没有看懂题面,不能搞懂循环点在哪,很迷很颓,就像一个心结一样压着,今天抽空又拿来看了一波,觉得很有搞头,于是在追求着一遍ac的前提下,不断拿样例调试,然后真的一遍A了,(突然兴奋)
#include<stdio.h> #include<math.h> int flag[13]; int money[13]; int main () { int chuxuq = 0, chuxuh , chuxusum = 0, cinmoney = 0 , haha = 0; for(int i = 1 ; i <= 12 ; i ++) { scanf("%d",&money[i]); chuxuq = chuxuq + 300 - money[i] ; if(chuxuq < 0) { for(int k = i ; k <= 12 ; k ++) flag[k] = k ; haha = 1 ; } if( chuxuq / 100 > 0 ) { cinmoney = chuxuq / 100 * 100 ; chuxusum += cinmoney ; } chuxuq = chuxuq - cinmoney ; cinmoney = 0 ; } chuxuh = chuxuq + ceil(1.2*chuxusum) ; for(int j = 1 ; j <= 12 ; j ++) { if(flag[j] != 0) { printf("%d",-flag[j]); break ; } } if(haha == 0) printf("%d",chuxuh); return 0 ; }
//请忽略鬼畜的变量名233333
在这道题上,第一次尝试一种很颓很没用的判断flag的方法,以及很占内存,莫名这样写,虽然没用,但是合理控制条件还是可以瞎玩玩的,本来是打算用类似printf的返回值=1这种作为循环的终点,然而我不知道有没有这种用法,倒是在while的终止条件见过类似于
while(getchar() != 0) { ************* }
如上的用法。
也是很迷,其实只是一个很简单的水题,但是过了这道题就有一种莫名的开心与兴奋
顺带附上在搜题解的时候莫名看到的游戏
#include<iostream> #include<windows.h> #include<conio.h> #include<time.h> #include<string> using namespace std; /*=============== all the structures ===============*/ typedef struct Frame { COORD position[2]; int flag; }Frame; /*=============== all the functions ===============*/ void SetPos(COORD a)// set cursor { HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(out, a); } void SetPos(int i, int j)// set cursor { COORD pos={i, j}; SetPos(pos); } void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } //把第y行,[x1, x2) 之间的坐标填充为 ch void drawRow(int y, int x1, int x2, char ch) { SetPos(x1,y); for(int i = 0; i <= (x2-x1); i++) cout<<ch; } //在a, b 纵坐标相同的前提下,把坐标 [a, b] 之间填充为 ch void drawRow(COORD a, COORD b, char ch) { if(a.Y == b.Y) drawRow(a.Y, a.X, b.X, ch); else { SetPos(0, 25); cout<<"error code 01:无法填充行,因为两个坐标的纵坐标(x)不相等"; system("pause"); } } //把第x列,[y1, y2] 之间的坐标填充为 ch void drawCol(int x, int y1, int y2, char ch) { int y=y1; while(y!=y2+1) { SetPos(x, y); cout<<ch; y++; } } //在a, b 横坐标相同的前提下,把坐标 [a, b] 之间填充为 ch void drawCol(COORD a, COORD b, char ch) { if(a.X == b.X) drawCol(a.X, a.Y, b.Y, ch); else { SetPos(0, 25); cout<<"error code 02:无法填充列,因为两个坐标的横坐标(y)不相等"; system("pause"); } } //左上角坐标、右下角坐标、用row填充行、用col填充列 void drawFrame(COORD a, COORD b, char row, char col) { drawRow(a.Y, a.X+1, b.X-1, row); drawRow(b.Y, a.X+1, b.X-1, row); drawCol(a.X, a.Y+1, b.Y-1, col); drawCol(b.X, a.Y+1, b.Y-1, col); } void drawFrame(int x1, int y1, int x2, int y2, char row, char col) { COORD a={x1, y1}; COORD b={x2, y2}; drawFrame(a, b, row, col); } void drawFrame(Frame frame, char row, char col) { COORD a = frame.position[0]; COORD b = frame.position[1]; drawFrame(a, b, row, col); } void drawPlaying() { drawFrame(0, 0, 48, 24, ‘=‘, ‘|‘);// draw map frame; drawFrame(49, 0, 79, 4, ‘-‘, ‘|‘);// draw output frame drawFrame(49, 4, 79, 9, ‘-‘, ‘|‘);// draw score frame drawFrame(49, 9, 79, 20, ‘-‘, ‘|‘);// draw operate frame drawFrame(49, 20, 79, 24, ‘-‘, ‘|‘);// draw other message frame SetPos(52, 6); cout<<"得分:"; SetPos(52, 7); cout<<"称号:"; SetPos(52,10); cout<<"操作方式:"; SetPos(52,12); cout<<" a,s,d,w 控制陈伟移动。"; SetPos(52,14); cout<<" p 暂停游戏。"; SetPos(52,16); cout<<" e 退出游戏。"; } //在[a, b)之间产生一个随机整数 int random(int a, int b) { int c=(rand() % (a-b))+ a; return c; } //在两个坐标包括的矩形框内随机产生一个坐标 COORD random(COORD a, COORD b) { int x=random(a.X, b.X); int y=random(a.Y, b.Y); COORD c={x, y}; return c; } bool judgeCoordInFrame(Frame frame, COORD spot) { if(spot.X>=frame.position[0].X) if(spot.X<=frame.position[1].X) if(spot.Y>=frame.position[0].Y) if(spot.Y<=frame.position[0].Y) return true; return false; } void printCoord(COORD a) { cout <<"( "<<a.X<<" , "<<a.Y<<" )"; } void printFrameCoord(Frame a) { printCoord(a.position[0]); cout <<" - "; printCoord(a.position[1]); } int drawMenu() { SetPos(30, 1); cout<<"P l a n e W a r"; drawRow(3, 0, 79, ‘-‘); drawRow(5, 0, 79, ‘-‘); SetPos(28, 4); cout<<"w 和 s 选择, k 确定"; SetPos(15, 11); cout<<"1. 点心"; SetPos(15, 13); cout<<"2. 大餐"; drawRow(20, 0, 79, ‘-‘); drawRow(22, 0, 79, ‘-‘); SetPos(47, 11); cout<<"点心:"; SetPos(51, 13); cout<<"点心有着较慢的移动速度。"; SetPos(24, 21); int j=11; SetPos(12, j); cout<<">>"; //drawFrame(45, 9, 79, 17, ‘=‘, ‘|‘); while(1) { if( _kbhit() ) { char x=_getch(); switch (x) { case ‘w‘ : { if( j == 13) { SetPos(12, j); cout<<" "; j = 11; SetPos(12, j); cout<<">>"; SetPos(51, 13); cout<<" "; SetPos(47, 11); cout<<"点心:"; SetPos(51, 13); cout<<"点心有着较慢的移动速度。"; } break; } case ‘s‘ : { if( j == 11 ) { SetPos(12, j); cout<<" "; j = 13; SetPos(12, j); cout<<">>"; SetPos(51, 13); cout<<" "; SetPos(47, 11); cout<<"大餐:"; SetPos(51, 13); cout<<"大餐移动速度较快。"; } break; } case ‘k‘ : { if (j == 8) return 1; else return 2; } } } } } /* DWORD WINAPI MusicFun(LPVOID lpParamte) { //DWORD OBJ; sndPlaySound(TEXT("bgm.wav"), SND_FILENAME|SND_ASYNC); return 0; } */ /*================== the Game Class ==================*/ class Game { public: COORD position[10]; COORD bullet[10]; Frame enemy[8]; int score; int rank; int rankf; string title; int flag_rank; Game (); //初始化所有 void initPlane(); void initBullet(); void initEnemy(); //初始化其中一个 //void initThisBullet( COORD ); //void initThisEnemy( Frame ); void planeMove(char); void bulletMove(); void enemyMove(); //填充所有 void drawPlane(); void drawPlaneToNull(); void drawBullet(); void drawBulletToNull(); void drawEnemy(); void drawEnemyToNull(); //填充其中一个 void drawThisBulletToNull( COORD ); void drawThisEnemyToNull( Frame ); void Pause(); void Playing(); void judgePlane(); void judgeEnemy(); void Shoot(); void GameOver(); void printScore(); }; Game::Game() { initPlane(); initBullet(); initEnemy(); score = 0; rank = 25; rankf = 0; flag_rank = 0; } void Game::initPlane() { COORD centren={39, 22}; position[0].X=position[5].X=position[7].X=position[9].X=centren.X; position[1].X=centren.X-2; position[2].X=position[6].X=centren.X-1; position[3].X=position[8].X=centren.X+1; position[4].X=centren.X+2; for(int i=0; i<=4; i++) position[i].Y=centren.Y; for(int i=6; i<=8; i++) position[i].Y=centren.Y+1; position[5].Y=centren.Y-1; position[9].Y=centren.Y-2; } void Game::drawPlane() { for(int i=0; i<9; i++) { int j=0; SetPos(position[i]); if(i!=5) { if(j>0) continue; else cout<<"伟"; j++; } else if(i==5) { cout<<"陈"; break; } } } void Game::drawPlaneToNull() { for(int i=0; i<9; i++) { SetPos(position[i]); cout<<" "; } } void Game::initBullet() { for(int i=0; i<10; i++) bullet[i].Y = 30; } void Game::drawBullet() { for(int i=0; i<10; i++) { if( bullet[i].Y != 30) { SetPos(bullet[i]); cout<<"吃"; } } } void Game::drawBulletToNull() { for(int i=0; i<10; i++) if( bullet[i].Y != 30 ) { COORD pos={bullet[i].X, bullet[i].Y+1}; SetPos(pos); cout<<" "; } } void Game::initEnemy() { COORD a={1, 1}; COORD b={45, 15}; for(int i=0; i<8; i++) { enemy[i].position[0] = random(a, b); enemy[i].position[1].X = enemy[i].position[0].X + 3; enemy[i].position[1].Y = enemy[i].position[0].Y + 2; } } void Game::drawEnemy() { for(int i=0; i<8; i++) drawFrame(enemy[i].position[0], enemy[i].position[1], ‘-‘, ‘|‘); } void Game::drawEnemyToNull() { for(int i=0; i<8; i++) { drawFrame(enemy[i].position[0], enemy[i].position[1], ‘ ‘, ‘ ‘); } } void Game::Pause() { SetPos(61,2); cout<<" "; SetPos(61,2); cout<<"暂停中..."; char c=_getch(); while(c!=‘p‘) c=_getch(); SetPos(61,2); cout<<" "; } void Game::planeMove(char x) { if(x == ‘a‘) if(position[1].X != 1) for(int i=0; i<=9; i++) position[i].X -= 2; if(x == ‘s‘) if(position[7].Y != 23) for(int i=0; i<=9; i++) position[i].Y += 1; if(x == ‘d‘) if(position[4].X != 47) for(int i=0; i<=9; i++) position[i].X += 2; if(x == ‘w‘) if(position[5].Y != 3) for(int i=0; i<=9; i++) position[i].Y -= 1; } void Game::bulletMove() { for(int i=0; i<10; i++) { if( bullet[i].Y != 30) { bullet[i].Y -= 1; if( bullet[i].Y == 1 ) { COORD pos={bullet[i].X, bullet[i].Y+1}; drawThisBulletToNull( pos ); bullet[i].Y=30; } } } } void Game::enemyMove() { for(int i=0; i<8; i++) { for(int j=0; j<2; j++) enemy[i].position[j].Y++; if(24 == enemy[i].position[1].Y) { COORD a={1, 1}; COORD b={45, 3}; enemy[i].position[0] = random(a, b); enemy[i].position[1].X = enemy[i].position[0].X + 3; enemy[i].position[1].Y = enemy[i].position[0].Y + 2; } } } void Game::judgePlane() { for(int i = 0; i < 8; i++) for(int j=0; j<9; j++) if(judgeCoordInFrame(enemy[i], position[j])) { SetPos(62, 1); cout<<"撑死"; drawFrame(enemy[i], ‘+‘, ‘+‘); Sleep(1000); GameOver(); break; } } void Game::drawThisBulletToNull( COORD c) { SetPos(c); cout<<" "; } void Game::drawThisEnemyToNull( Frame f ) { drawFrame(f, ‘ ‘, ‘ ‘); } void Game::judgeEnemy() { for(int i = 0; i < 8; i++) for(int j = 0; j < 10; j++) if( judgeCoordInFrame(enemy[i], bullet[j]) ) { score += 5; drawThisEnemyToNull( enemy[i] ); COORD a={1, 1}; COORD b={45, 3}; enemy[i].position[0] = random(a, b); enemy[i].position[1].X = enemy[i].position[0].X + 3; enemy[i].position[1].Y = enemy[i].position[0].Y + 2; drawThisBulletToNull( bullet[j] ); bullet[j].Y = 30; } } void Game::Shoot() { for(int i=0; i<10; i++) if(bullet[i].Y == 30) { bullet[i].X = position[5].X; bullet[i].Y = position[5].Y-1; break; } } void Game::printScore() { if(score == 120 && flag_rank == 0) { rank -= 3; flag_rank = 1; } else if( score == 360 && flag_rank == 1) { rank -= 5; flag_rank = 2; } else if( score == 480 && flag_rank == 2) { rank -= 5; flag_rank = 3; } int x=rank/5; SetPos(60, 6); cout<<score; if( rank!=rankf ) { SetPos(60, 7); if( x == 5) title="初级吃货"; else if( x == 4) title="中级吃货"; else if( x == 3) title="高级吃货"; else if( x == 2 ) title="王牌吃货"; cout<<title; } rankf = rank; } void Game::Playing() { //HANDLE MFUN; //MFUN= CreateThread(NULL, 0, MusicFun, NULL, 0, NULL); drawEnemy(); drawPlane(); int flag_bullet = 0; int flag_enemy = 0; while(1) { Sleep(8); if(_kbhit()) { char x = _getch(); if (‘a‘ == x || ‘s‘ == x || ‘d‘ == x || ‘w‘ == x) { drawPlaneToNull(); planeMove(x); drawPlane(); judgePlane(); } else if (‘p‘ == x) Pause(); else if( ‘k‘ == x) Shoot(); else if( ‘e‘ == x) { //CloseHandle(MFUN); GameOver(); break; } } /* 处理子弹 */ if( 0 == flag_bullet ) { bulletMove(); drawBulletToNull(); drawBullet(); judgeEnemy(); } flag_bullet++; if( 5 == flag_bullet ) flag_bullet = 0; /* 处理敌人 */ if( 0 == flag_enemy ) { drawEnemyToNull(); enemyMove(); drawEnemy(); judgePlane(); } flag_enemy++; if( flag_enemy >= rank ) flag_enemy = 0; /* 输出得分 */ printScore(); } } void Game::GameOver() { system("cls"); COORD p1={28,9}; COORD p2={53,15}; drawFrame(p1, p2, ‘=‘, ‘|‘); SetPos(36,12); string str="Game Over!"; for(int i=0; i<str.size(); i++) { Sleep(80); cout<<str[i]; } Sleep(1000); system("cls"); drawFrame(p1, p2, ‘=‘, ‘|‘); SetPos(31, 11); cout<<"吃掉馒头:"<<score/5<<" 个"; SetPos(31, 12); cout<<"得 分:"<<score; SetPos(31, 13); cout<<"获得称号:"<<title; SetPos(30, 16); Sleep(1000); cout<<"继续? 是(y)| 否(n)"; as: char x=_getch(); if (x == ‘n‘) exit(0); else if (x == ‘y‘) { system("cls"); Game game; int a = drawMenu(); if(a == 2) game.rank = 20; system("cls"); drawPlaying(); game.Playing(); } else goto as; } /*================== the main function ==================*/ int main() { //游戏准备 srand((int)time(0)); //随机种子 HideCursor(); //隐藏光标 Game game; int a = drawMenu(); if(a == 2) game.rank = 20; system("cls"); drawPlaying(); game.Playing(); }
其实也是闲的无聊,今天又在机房呆了3个多小时,一部分时间在理解DP,构建DP的思维,然而知识储备还是不够丰富,很多东西没法理解,所以上个随笔先颓着。
刚才有省队领队大佬很傲娇地来围观我,莫名方成狗=。=
还有217天初赛, 还有245天复赛。
那是我愿意付诸一生的人,现在却没法拥有。
以上是关于面试题新的主要内容,如果未能解决你的问题,请参考以下文章