記找工作中的磕磕碰碰(持續(xù)更新)
個(gè)人認(rèn)為有趣的題的總結(jié),希望對(duì)大家有幫助。
轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/callon_h/article/details/52430312
在騰訊的2016.9.1模擬考中最后的編程題
題目大意:給一個(gè)邊長(zhǎng)n,給出1-n^2的數(shù)字蛇形數(shù)據(jù),如下?
n=3?
output:
1 2 3?
8 9 4?
7 6 5
此題后來發(fā)現(xiàn)在另一篇博文中
http://blog.csdn.net/z_x_b5/article/details/51056536?locationNum=1
也有記錄,思想接近,不過用的方法不盡相同吧,大家參考參考即可:
#include
int Ori_width,New_width;
void resort(int *temp, int *temp1){
int i,j;
if(New_width == 1 || New_width == 0){
if(New_width == 0)
return;
*temp1 = Ori_width*Ori_width;
return;
}
else
{ //right
for(i=0;i
運(yùn)行結(jié)果:
2. java知識(shí)考察
在騰訊的2016.9.1模擬考中的選擇題
有如下代碼:
public static void main(String[] args){
Integer i1=127,i2=127,i3=128,i4=128;
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
System.out.println(i3==i4);
System.out.println(i3.equals(i4));
}
請(qǐng)問代碼最終輸出情況:
如果java掌握不牢固,這道題也很難答,乍一看兩個(gè)==和兩個(gè)equals至少是兩個(gè)true或者兩個(gè)false或者全true全false吧?
但是,判斷結(jié)果該是:true true false true。
理由:==總在基本數(shù)據(jù)類型時(shí)比較的是兩個(gè)數(shù)據(jù)值是否相同(.equals在object類中比較的是地址,但是子類一般都會(huì)重寫它,在基本數(shù)據(jù)類型中表示的是值的大小是否一樣),如果用在引用類型時(shí)比較的是地址是否相同,也就是比較兩個(gè)對(duì)象的引用是否相同,為了節(jié)省內(nèi)存,java設(shè)計(jì)了基本數(shù)據(jù)類型包裝類的緩存,JVM會(huì)自動(dòng)維護(hù)8種基本類型的緩存/常量池,大概意思是程序啟動(dòng)時(shí),這些數(shù)值已經(jīng)放在緩存池中,你new 一個(gè)Integer對(duì)象,它首先去緩存去查,如果有的話,直接將新new出的對(duì)象引用指向緩存池中的對(duì)象,Integer緩存的范圍是[-128,127],超出范圍就需要重新在堆內(nèi)存中new了。所以當(dāng)為i=127賦值時(shí),在自動(dòng)裝箱過程中是取自常量池/緩存池中的數(shù)值,而當(dāng)i=128時(shí),128不在常量池范圍內(nèi),所以在自動(dòng)裝箱過程中需要new128,所以地址不一樣。
3.數(shù)據(jù)庫(kù)知識(shí)
在RR2016.9.5筆試題中
數(shù)據(jù)庫(kù)系統(tǒng)中,產(chǎn)生數(shù)據(jù)不一致的根本原因是:數(shù)據(jù)冗余。
理由:首先,數(shù)據(jù)不一致性是指數(shù)據(jù)的矛盾性、不相容性。 產(chǎn)生數(shù)據(jù)不一致的原因主要有以下三種:一是由于數(shù)據(jù)冗余造成的;二是由于并發(fā)控制不當(dāng)造成的;三是由于各種故障、錯(cuò)誤造成的。但根本原因是:數(shù)據(jù)冗余。
4.二叉樹遍歷
在RR2016.9.5筆試題中
已知前序遍歷aebdc,后序遍歷bcdea,根節(jié)點(diǎn)下的子節(jié)點(diǎn)有?
只有e。
理由:首先了解什么是前序、中序和后序遍歷,總的來說就是NLR、LNR和LRN。L為訪問左結(jié)點(diǎn),R為訪問右結(jié)點(diǎn),N為訪問本結(jié)點(diǎn)。知道這個(gè)之后來看這個(gè)問題:根據(jù)前序或后續(xù)序列,可以確定a必定有一個(gè)子結(jié)點(diǎn)e,假設(shè)e為左孩子,a右孩子不為空,則后續(xù)遍歷序列中與a相鄰的應(yīng)該為a的右孩子。同理,假設(shè)e為右孩子,a的左孩子不為空,則先序遍歷時(shí)與a相鄰的為a的左孩子。故a有且只有e這一個(gè)孩子,左右無法確定。
同樣是RR2016.9.5筆試
已知前序遍歷aebdc,中序遍歷becda,后序遍歷:______________。
bcdea。
理由:有時(shí)候遍歷會(huì)迷糊,但是掌握程序的本質(zhì)寫法是遞歸之后,也就不會(huì)迷惑了。
5.IP知識(shí)
在RR2016.9.5筆試題中
某主機(jī)的IP地址為202.117.131.12/20,其子網(wǎng)掩碼是多少?
255.255.240.0。
理由:默認(rèn)子網(wǎng)掩碼是255.255.255.0,但是最后的/20限定了前面只能有20個(gè)1,那么255是8位,所以至少有2個(gè)255,最后四個(gè)1應(yīng)該是128+64+32+16=240,最后得到255.255.240.0。
同樣是RR2016.9.5筆試
IP地址159.226.181.1是____A類?B類?C類?D類?IP地址。
B類。
理由:A類IP地址范圍:1.0.0.1 - 126.255.255.254。B類:128.1.0.1 - 191.255.255.254。C類: 192.0.1.1 - 123.255.255.254。
6.指針數(shù)組
還是RR2016.9.5的筆試題,這個(gè)比較簡(jiǎn)單,
求一個(gè)程序的輸出:
int a[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
int (*ptr)[3];
ptr = (int (*)[3])a;
printf("result is %dn",a[3][1] - ptr[3][1]);
答案是:3。
理由:在ptr看來是這樣的:
1 2 3
4 5 6
7 8 9
10 11 12
...
14-11=3。
7.進(jìn)程死鎖
在某銀行2016.9.6筆試題中
若系統(tǒng)中有5個(gè)進(jìn)程共享若干個(gè)資源R,每個(gè)進(jìn)程都需要4個(gè)資源R,那么使系統(tǒng)不發(fā)生死鎖的資源R的最少數(shù)目是_______。
16。
理由:假設(shè)系統(tǒng)為每個(gè)進(jìn)程各分配了3個(gè)R,此時(shí)只需要再有1個(gè)R就能保證有一個(gè)進(jìn)程可以運(yùn)行,進(jìn)程運(yùn)行完畢后釋放占有的所有資源,其他進(jìn)程又可以運(yùn)行,直到所有進(jìn)程運(yùn)行完畢。
8.可能出棧順序
某銀行2016.9.6筆試題中(其他也考過)
若進(jìn)棧序列為e1,e2,e3,e4,那么可能的出棧順序_____。
一般為選擇題,此時(shí)只介紹方法,如果先出來的是e3,那么證明e2,e1早就壓棧了,后面肯定不能接e1,因?yàn)閑1在e2下面,如此邏輯推理即可。
9.簡(jiǎn)單練習(xí)——C調(diào)序
在新美大的網(wǎng)上測(cè)試中,
輸入一個(gè)整數(shù)數(shù)組,調(diào)整數(shù)組中數(shù)字的順序,使得所有奇數(shù)位于數(shù)組的前半部分,所有偶數(shù)位于數(shù)組的后半部分,要求時(shí)間復(fù)雜度為O(n)。
輸入包含一行,為逗號(hào)隔開的一個(gè)或者多個(gè)整數(shù),取值范圍為[1,100]。如:
1,2,3,4
輸出包含一行,同樣為逗號(hào)隔開的一個(gè)或者多個(gè)整數(shù)。如:
1,3,2,4
#include
#define MAX_LEN 1000
int main()
{
char end;
int arr[MAX_LEN];
int temp=0,i =0,j=0,k=0;
do{
scanf("%d",&arr[i++]);
if(arr[i-1]>100)
arr[i-1]=100;
else if(arr[i-1]<1)
arr[i-1] = 1;
}while((end = getchar())!='n');
while(1)
{
for(j=0;j0;k--)
{
if(arr[k]%2==1)
break;
}
if(j
運(yùn)行結(jié)果:
10.簡(jiǎn)單練習(xí)——二維卷積
同樣在新美大的網(wǎng)上測(cè)試中,
題目太長(zhǎng),原諒我就打要求吧:
要求輸入矩陣A[m*n],卷積核h[k*k],m>k且n>k;輸出卷積后矩陣。
輸入包括三行:
第一行為三個(gè)正整數(shù),空格隔開,分別為k,m,n,取值范圍為[1,100];
第二行為m*n個(gè)正整數(shù),空格隔開,為輸入矩陣A的各元素值,取值范圍為[1,100];
第三行為k*k個(gè)正整數(shù),空格隔開,為卷積核矩陣h的各元素值,取值范圍為[1,100]。
如:
2 3 3
1 2 1 0 2 2 2 1 1
-1 1 1 -1
輸出包括一行,按順序輸出矩陣B每行的元素值,空格隔開,如:
-1 -1 3 0
#include
#define MAX_LEN 1000
int main()
{
int temp[3];
int k,m,n;
int i,j,row,col;
for(i=0;i<3;i++){
scanf("%d",&temp[i]);
if(temp[i]>100)
temp[i] = 100;
else if(temp[i]<1)
temp[i] = 1;
}
k=temp[0];
m=temp[1];
n=temp[2];
//:can delete
if(m<=k)
m=k+1;
if(n<=k)
n=k+1;
//:~
do{
int A[m][n];//input
int h[k][k],t[k][k];
int B[m-k+1][n-k+1];//output
for(row=0;row<(m-k+1);row++)
for(col=0;col<(n-k+1);col++)
B[row][col] = 0;
for(i=0;i100)
A[i][j] = 100;
else if(A[i][j]<-100)
A[i][j]=-100;
}
}
for(i=0;i100)
h[i][j] = 100;
else if(h[i][j]<-100)
h[i][j]=-100;
}
}
for(row=0;row<(m-k+1);row++){
for(col=0;col<(n-k+1);col++){
for(i=0;i
輸出:
11.初級(jí)算法
目前沒有直接考的,但是有些題是它的變種——硬幣找零。
在某個(gè)找零機(jī)器內(nèi)存有n個(gè)值為V1,V2,V3,...的硬幣,當(dāng)有人拿出值為T的錢需要找零時(shí),求問找零的硬幣最少需要多少?由哪些硬幣組成?
#include
#define MAX_TYPE 100
#define PRINT
//Just review shellsort, not necessary.
void shellsort(int *arr,int size)
{
int h=1,i=0;
while(h0)
{
for(i=0;(i+h)arr[i])
{
int temp = arr[i+h];
arr[i+h] = arr[i];
arr[i] = temp;
}
}
h=(h-1)/3;
}
}
void makeChange(int *moneytype,int typenum,int money,int *coin)
{
int i,k,min;
#ifdef PRINT
int j,n,flag;
int arr[money+1][money+1];
arr[0][0] = 0;
flag = 0;
#endif
coin[0] = 0;
for(i=1;i
12.鏈表操作
沒有完全考到這部分的,但是相關(guān)的還是不少。
以Linux內(nèi)核鏈表為例復(fù)習(xí)。
#include
struct list_head{
struct list_head *next,*prev;
};
struct score{
int No;
int english;
int chinese;
int math;
struct list_head list;
};
struct list_head header;
struct score stu1,stu2,stu3;
struct list_head *slider;
struct score *tmp;
void Init_List_Head(struct list_head *head)
{
head->next = head;
head->prev = head;
}
void __list_add(struct list_head *nw, struct list_head *prev, struct list_head *next)
{
next->prev = nw;
nw->next = next;
nw->prev = prev;
prev->next = nw;
}
void list_add_tail(struct list_head *nw, struct list_head *head)
{
__list_add(nw,head->prev,head);
}
void list_add_top(struct list_head *nw, struct list_head *head)
{
__list_add(nw,head,head->next);
}
int main()
{
Init_List_Head(&header);
stu1.No = 1;
stu1.chinese = 89;
stu1.english = 90;
stu1.math = 98;
list_add_tail(&stu1.list,&header);
stu2.No = 2;
stu2.chinese = 12;
stu2.english = 13;
stu2.math = 14;
list_add_top(&stu2.list,&header);
stu3.No = 3;
stu3.chinese = 69;
stu3.english = 80;
stu3.math = 74;
list_add_tail(&stu3.list,&header);
for(slider=header.next;slider!=&header;slider=slider->next){
const typeof(((struct score *)0)->list) *__mptr = slider;
tmp = (struct score *)((char *)__mptr - (unsigned int)&(((struct score*)0)->list));
printf("No is %d,english is %d,math is%dn",tmp->No,tmp->english,tmp->math);
}
return 0;
}