TX相关
3. TCP的三次握手
4. 現在的最新技術,多線程,數據庫,緩沖技術
5. 未來五年的職業規劃
6. 熟不熟悉網絡編程,
7. TCP靠什么來保證數據傳輸的可靠;
8. 說一下,客戶端和服務器端用socket的通信過程;進程間通信的方式,你都用過哪些來寫進程間通信;
9. 關于項目的各種問題,項目中有沒有用緩沖技術,并介紹一下;
10. 數據庫中的事務概念和作用,有什么性質,原子性通過什么來體現的;
11. 為什么要建立索引;
12. 會不會算法和數據結構
?
2. 針對簡歷上的內容提了一些問題:做過哪些項目?印象最深的項目是哪個?那個項目采用的是什么架構,設計思想等等
3. 熟不熟悉linux,有哪些指令,邊寫邊解釋下;TCP和UDP的區別,TCP的三次握手,socket編程,寫一個簡單的socket通信思路;
4. 用過哪些數據庫;什么是索引,它有什么作用;
5. 問了下現在最新的技術,比如云計算之類的,還有海量數據處理的一些技術,
6. 進程間通信的方式,有沒有具體使用過那些通信方式;有沒有用過多線程;
7. 快速寫出冒泡排序。
Linux的同步機制從2.0到2.6以來不斷發展完善。從最初的原子操作,到后來的信號量,從大內核鎖到今天的自旋鎖。這些同步機制的發展伴隨Linux從單處理器到對稱多處理器的過渡;
伴隨著從非搶占內核到搶占內核的過度。Linux的鎖機制越來越有效,也越來越復雜。
Linux的內核鎖主要是自旋鎖和信號量。
自旋鎖最多只能被一個可執行線程持有,如果一個執行線程試圖請求一個已被爭用(已經被持有)的自旋鎖,那么這個線程就會一直進行忙循環——旋轉——等待鎖重新可用。要是鎖未被爭用,請求它的執行線程便能立刻得到它并且繼續進行。自旋鎖可以在任何時刻防止多于一個的執行線程同時進入臨界區。
Linux中的信號量是一種睡眠鎖。如果有一個任務試圖獲得一個已被持有的信號量時,信號量會將其推入等待隊列,然后讓其睡眠。這時處理器獲得自由去執行其它代碼。當持有信號量的進程將信號量釋放后,在等待隊列中的一個任務將被喚醒,從而便可以獲得這個信號量。
信號量的睡眠特性,使得信號量適用于鎖會被長時間持有的情況;只能在進程上下文中使用,因為中斷上下文中是不能被調度的;另外當代碼持有信號量時,不可以再持有自旋鎖。
1.從 a.log 文件中提取包含“WARNING”或”FATAL”,同時不包含“IGNOR”的行,然后,提取以“:”分割的第五個字段?
grep?-E ‘WARNING|FATAL’ a.log?|?grep-v’IGNOR’?|?awk?-F?:?’{print $5 }’
2.添加一個新組為class01,然后,添加屬于這個組的30個用戶,用戶名的形式為stdXX,其中,XX從 01到 30?
#!/bin/bash
groupadd class01
for((i=1;i<=9;i++))
do
useradd std0$i?-G class01
done
for((i=10;i<=30;i++))
do
useradd std$i?-G class01
done
3.在每個月的第一天備份并壓縮/etc目錄下的所有內容,存放在/root/backup目錄里,且文件名為如下形式yymmdd_etc,yy為年,mm為月,dd為日。shell程序 fileback存放在/usr/bin 目錄下?
tar?-zcf?/root/backup/`date+%y%m%d`_etc?/etc
4.用shell編程,判斷一文件是不是字符設備文件,如果是將其拷貝到/dev目錄下?
#!/bin/bash
if?test$#?-ne1
then
echo?”ERROR”
exit?1
fi
if?test?-c?$1
then
/bin/cp -a?$1?/dev/
exit0
fi
exit?1
5.某系統管理員需要每天做一定的重復工作,編制一個解決方案:
(1).從下午 4:50 刪除/abc 目錄下的全部子目錄和全部文件;
(2).從早上 8:00~下午 6:00每小時讀取/xyz目錄下x1 文件中每行第一個域的全部數據加入到/backup目錄下的 back01.txt文件內;
(3).每逢周一下午 5:50 將/data目錄下的所有目錄和文件歸檔并壓縮為文件backup.tar.gz;
(4).在下午 5:55 將IDE接口的CD-ROM缷載(假設CD-ROM的設備名為 hdc);
(5).在早上 8:00 開機后啟動。
使用計劃任務來完成:
crontab-e
———————–
50 16?*?*?*?rm-rf/abc/*
00 08-18?*?*?*?awk ‘{print$1 }’?/xyz/x1?>>?/backup/back01.txt
50 17?*?*?01 tar-zcf/backup/backup.tar.gz?/data
55 17?*?*?*?umount/dev/hdc
———————–
設定BIOS每日上午 08:00開機
騰訊筆試題:const的含義及實現機制
const的含義及實現機制,比如:const int i,是怎么做到i只可讀的?
const用來說明所定義的變量是只讀的。
這些在編譯期間完成,編譯器可能使用常數直接替換掉對此變量的引用。
更多閱讀:
http://www.92ask.net/Archive/?action=show&id=18
初探編譯器static、const之實現原理
騰訊筆試題:買200返100優惠券,實際上折扣是多少?
到商店里買200的商品返還100優惠券(可以在本商店代替現金)。請問實際上折扣是多少?
由于優惠券可以代替現金,所以可以使用200元優惠券買東西,然后還可以獲得100元的優惠券。
假設開始時花了x元,那么可以買到 x + x/2 + x/4 +?…的東西。所以實際上折扣是50%.(當然,大部分時候很難一直兌換下去,所以50%是折扣的上限)
如果使用優惠券買東西不能獲得新的優惠券,那么
總過花去了200元,可以買到200+100元的商品,所以實際折扣為 200/300 = 67%.
騰訊筆試題:tcp三次握手的過程,accept發生在三次握手哪個階段?
accept發生在三次握手之后。
第一次握手:客戶端發送syn包(syn=j)到服務器。
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個ASK包(ask=k)。
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1)。
三次握手完成后,客戶端和服務器就建立了tcp連接。這時可以調用accept函數獲得此連接。
騰訊筆試題:用UDP協議通訊時怎樣得知目標機是否獲得了數據包
用UDP協議通訊時怎樣得知目標機是否獲得了數據包?
可以在每個數據包中插入一個唯一的ID,比如timestamp或者遞增的int。
發送方在發送數據時將此ID和發送時間記錄在本地。
接收方在收到數據后將ID再發給發送方作為回應。
發送方如果收到回應,則知道接收方已經收到相應的數據包;如果在指定時間內沒有收到回應,則數據包可能丟失,需要重復上面的過程重新發送一次,直到確定對方收到。
關于UDP協議的簡單介紹,可以參考
http://baike.baidu.com/view/30509.htm
騰訊筆試題:統計論壇在線人數分布
求一個論壇的在線人數,假設有一個論壇,其注冊ID有兩億個,每個ID從登陸到退出會向一個日志文件中記下登陸時間和退出時間,要求寫一個算法統計一天中論壇的用戶在線分布,取樣粒度為秒。
一天總共有 3600*24 = 86400秒。
定義一個長度為86400的整數數組int delta[86400],每個整數對應這一秒的人數變化值,可能為正也可能為負。開始時將數組元素都初始化為0。
然后依次讀入每個用戶的登錄時間和退出時間,將與登錄時間對應的整數值加1,將與退出時間對應的整數值減1。
這樣處理一遍后數組中存儲了每秒中的人數變化情況。
定義另外一個長度為86400的整數數組int online_num[86400],每個整數對應這一秒的論壇在線人數。
假設一天開始時論壇在線人數為0,則第1秒的人數online_num[0] = delta[0]。第n+1秒的人數online_num[n] = online_num[n-1] + delta[n]。
這樣我們就獲得了一天中任意時間的在線人數。
騰訊筆試題:從10G個數中找到中數
在一個文件中有 10G 個整數,亂序排列,要求找出中位數。內存限制為 2G。
不妨假設10G個整數是64bit的。
2G內存可以存放256M個64bit整數。
我們可以將64bit的整數空間平均分成256M個取值范圍,用2G的內存對每個取值范圍內出現整數個數進行統計。這樣遍歷一邊10G整數后,我們便知道中數在那個范圍內出現,以及這個范圍內總共出現了多少個整數。
如果中數所在范圍出現的整數比較少,我們就可以對這個范圍內的整數進行排序,找到中數。如果這個范圍內出現的整數比較多,我們還可以采用同樣的方法將此范圍再次分成多個更小的范圍(256M=2^28,所以最多需要3次就可以將此范圍縮小到1,也就找到了中數)。
訊筆試題:兩個整數集合A和B,求其交集
兩個整數集合A和B,求其交集。
1. 讀取整數集合A中的整數,將讀到的整數插入到map中,并將對應的值設為1。
2. 讀取整數集合B中的整數,如果該整數在map中并且值為1,則將此數加入到交集當中,并將在map中的對應值改為2。
通過更改map中的值,避免了將同樣的值輸出兩次。
騰訊筆試題:找出1到10w中沒有出現的兩個數字
有1到10w這10w個數,去除2個并打亂次序,如何找出那兩個數?
申請10w個bit的空間,每個bit代表一個數字是否出現過。
開始時將這10w個bit都初始化為0,表示所有數字都沒有出現過。
然后依次讀入已經打亂循序的數字,并將對應的bit設為1。
當處理完所有數字后,根據為0的bit得出沒有出現的數字。
首先計算1到10w的和,平方和。
然后計算給定數字的和,平方和。
兩次的到的數字相減,可以得到這兩個數字的和,平方和。
所以我們有
x + y = n
x^2 + y^2 = m
解方程可以得到x和y的值。
騰訊筆試題:需要多少只小白鼠才能在24小時內找到毒藥
有1000瓶水,其中有一瓶有毒,小白鼠只要嘗一點帶毒的水24小時后就會死亡,至少要多少只小白鼠才能在24小時時鑒別出那瓶水有毒?
最容易想到的就是用1000只小白鼠,每只喝一瓶。但顯然這不是最好答案。
既然每只小白鼠喝一瓶不是最好答案,那就應該每只小白鼠喝多瓶。那每只應該喝多少瓶呢?
首先讓我們換種問法,如果有x只小白鼠,那么24小時內可以從多少瓶水中找出那瓶有毒的?
由于每只小白鼠都只有死或者活這兩種結果,所以x只小白鼠最大可以表示2^x種結果。如果讓每種結果都對應到某瓶水有毒,那么也就可以從2^x瓶水中找到有毒的那瓶水。那如何來實現這種對應關系呢?
第一只小白鼠喝第1到2^(x-1)瓶,第二只小白鼠喝第1到第2^(x-2)和第2^(x-1)+1到第2^(x-1) + 2^(x-2)瓶….以此類推。
回到此題,總過1000瓶水,所以需要最少10只小白鼠。
騰訊筆試題:根據上排的數填寫下排的數,并滿足要求。
根據上排給出十個數,在其下排填出對應的十個數, 要求下排每個數都是上排對應位置的數在下排出現的次數。上排的數:0,1,2,3,4,5,6,7,8,9。
騰訊筆試題:判斷數字是否出現在40億個數中?
給40億個不重復的unsigned int的整數,沒排過序的,然后再給幾個數,如何快速判斷這幾個數是否在那40億個數當中?
答案:
unsigned int 的取值范圍是0到2^32-1。我們可以申請連續的2^32/8=512M的內存,用每一個bit對應一個unsigned int數字。首先將512M內存都初始化為0,然后每處理一個數字就將其對應的bit設置為1。當需要查詢時,直接找到對應bit,看其值是0還是1即可。
?
1、請定義一個宏,比較兩個數a、b?的大小,不能使用大于、小于、if?語句
2、如何輸出源文件的標題和目前執行行的行數
3、兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法
4、寫一個病毒
5、有A、B、C、D?四個人,要在夜里過一座橋。他們通過這座橋分別需要
耗時1、2、5、10?分鐘,只有一支手電,并且同時最多只能兩個人一起過橋。
請問,如何安排,能夠在17?分鐘內這四個人都過橋?
2005?年騰訊招聘
選擇題(60)
c/c++ os linux?方面的基礎知識c?的Sizeof?函數有好幾個!
程序填空(40)
1.(20) 4?空x5
不使用額外空間,將A,B?兩鏈表的元素交叉歸并
2.(20) 4?空x5
MFC?將樹序列化轉存在數組或鏈表中!
基本都是基礎題目,看來騰訊不準備放棄那些有思想但是
還沒有開始苦練基本功的人,只涉及到語言問題和簡單的
數據結構,其他的操作系統,編譯原理,離散數學,軟件
?
工程,計算機原理,體系結構等等無一涉及,題目很多,
有1?個選擇題想不來起來是什么了,題號不與原試題相符
希望師弟師妹可以探討探討答案,從中學到筆試的經驗
聲明:以下問題僅供本校園網校內師弟師妹為了考察自己學習的參考,不要
傳播
1?計算a^b<< 2 (運算符優先級問題)
2?根據先序中序求后序
3 a[3][4]哪個不能表示a[1][1]: *(&a[0][0]) *(*(a+1)+1) *(&a[1]+1)
*(&a[0][0]+4)
4 for(int i…)
for(int j…)
printf(i,j);
printf(j)
會出現什么問題
5 for(i=0;i<10;++i,sum+=i);的運行結果
6 10?個數順序插入查找二叉樹,元素62?的比較次數
7 10?個數放入模10hash?鏈表,最大長度是多少
8 fun((exp1,exp2),(exp3,exp4,exp5))有幾個實參
9?希爾冒泡快速插入哪個平均速度最快
10?二分查找是順序存儲鏈存儲按value?有序中的哪些
11?順序查找的平均時間
?
12 *p=NULL *p=new char[100] sizeof(p)各為多少
13?頻繁的插入刪除操作使用什么結構比較合適,鏈表還是數組
14 enum?的聲明方式
其他1?個選擇暫時想不起來了
大題:
1?把字符串轉換為小寫,不成功返回NULL,成功返回新串
char* toLower(char* sSrcStr)
{
char* sDest= NULL;
if( __1___)
{
int j;
sLen = strlen(sSrcStr);
sDest = new [_______2_____];
if(*sDest == NULL)
return NULL;
sDest[sLen] = ‘\0′;
while(_____3____)
sDest[sLen] = toLowerChar(sSrcStr[sLen]);
}
return sDest;
}
2?把字符串轉換為整數例如:”-123″ -> -123
main()
{
…..
if( *string == ‘-’ )
n = ____1______;
else
n = num(string);
?
…..
}
int num(char* string)
{
for(;!(*string==0);string++)
{
int k;
k = __2_____;
j = –sLen;
while( __3__)
k = k * 10;
num = num + k;
}
return num;
}
附加題:
1 linux?下調試core?的命令,察看堆棧狀態命令
2?寫出socks?套接字服務端客戶端通訊程序
3?填空補全程序,按照我的理解是添入:win32?調入dll?的函數名查找函數
入口的函數名找到函數的調用形式把formView?加到singledoc?的聲明將
singledoc?加到app?的聲明
4?有關系s(sno,sname) c(cno,cname) sc(sno,cno,grade)
1?問上課程”db”的學生no
2?成績最高的學生號
3?每科大于90?分的人數
試一共60?分鐘,分發試卷和收回試卷費時5?分鐘,實際考試時間55?分鐘。
?
?
?
選擇題36?道(都是5?個選項的),計算題14?道(一道題會有好幾個問),
題量比較大,我還有最后兩個空沒填寫,實在是沒時間了~~
題目考查的范圍比較全面,但是有所側重,例如:如果外匯相對于本國
貨幣升值,一般來說,本國的通貨膨脹率將會怎樣?下面就是5?個選項。
總體來說,試題本身難度不大,但是很費時間,閱讀的速度非常重要,
邏輯判斷的能力要求很高,要求快速閱讀、快速判斷、快速計算,而且還不
能粗心導致計算失誤(我一般出現的情況就是計算失誤~~,希望這次不會出
現~~)
騰訊這次的試卷可能字體印刷的比較小了,我的視力是5.3?的,看上去
不會有任何問題,但是坐在我后面的老兄就不好了,完全是模糊的一片,不
斷的縮減和紙張之間的距離才能看到,可能騰訊公司在這方面的成本應該適
當放寬(也許也是一種測試吧,身體素質的測試~~)
?
1.哪一個聲明是錯誤的( )
char * const p = 0;
char const * p = 0;
const char * p = 0;
char * p const = 0;
2.下面的結構體所占內存是( )
#pragma pack(4)
struct {
unino {
char ch1;
double num;
} bbb;
char ch2;
}aaa;
#pragma pack()
3.x = 0xffffffff,則 x = (x&0xffff0000) >> 16 的結果是( )
4.#define TEST(x) (x*2+1),則 TEST(1+1)的結果是( )
5.有15個結點的滿二叉樹,葉子數是( )
6.程序片段的輸出結果( )
class A {
public:
A() { printf(“A1 “); }
~A() { printf(“A2 “); }
};
class B : public A {
public:
B() { printf(“B1 “); }
~B() { printf(“B2 “); }
};
B b = new B;
delete b;
7.int Func(const char *)的重載函數是( ) (選項略)
8.按順序A, B, C進棧,出棧的結果是( )
9.程序片段的輸出結果( )
class A {
public:
virtual int func() { return 1; }
};
class B : public A {
public:
virtual int func() { return 2; }
};
A *a = new B;
printf(“%d %d\n”, a->func(), a->A::func());
delete a;
10.程序片段的執行描述中正確的是( )
class A {
public:
virtual void func(A& ra);
};
class B : public A {
public:
virtual void func(B& rb);
};
B b;
A &a = b;
a.func(b);
(有點記不清了,反正俺錯了這題,以為引用和指針是不同的…>_<)
11.關于哈希表特點錯誤的是( ) (選項略)
12.函數功能描述正確的是( )
int whatido(char * str)
{
return *str ? whatido(++str)+1 : 0;
}
二、程序填空(5×8)
1.二叉樹的遍歷
2.靜態單鏈表Appand元素
三、附加題(20×3)
1.寫出3D的鏡象轉置矩陣(什么東東?看不懂題意…)
2.SQL的簡單東東(俺全忘了…哭)
3.商場“買200送100”算折扣(還是不懂…)
?
c/c++ os linux 方面的基礎知識 c的Sizeof函數有好幾個!
程序填空(40)
1.(20) 4空x5
不使用額外空間,將 A,B兩鏈表的元素交叉歸并
2.(20) 4空x5
MFC ?將樹序列化 轉存在數組或 鏈表中!
1.請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句
// 這樣轉向定義應該不算違規吧!^_^
#include “stdafx.h”
#include <string.h>
#include <iostream>
using namespace std;
#define Cmp(x,y) compare(x,y)
int compare( int a, int b)
{
a^=(1<<31); b^=(1<<31);
int i=31;
while ((i^-1) && !((a&(1<<i))^(b&(1<<i)))) ? ? i–;
return (i^-1)?(((a>>i)&1)?1:-1):0;
}
int _tmain()
{
int c;
c = Cmp(5,4);
cout<<c<<endl;
return 0;
}
jruv ? (~~~一葉落而知天下秋~~~) 的答案:
#define ? COMPARE(a,b) ? ((a)-(b)) ? ? ? ? //<0: ? a<b ? =0:a==b>0:a>b
2.如何輸出源文件的標題和目前執行行的行數
cout ? << ? “Filename ? ” ? << ? __FILE__ ? << ? ” ? Line ? ” ? << ? __LINE__ ? << ? endl;
3.兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法
算法提示:
輸入 string a, string b; 計算string c=a*b; 返回 c;
1, ? ?紀錄小數點在a,b中的位置l1,l2, 則需要小數點后移動位置數為l=length(a)+length(b)-l1-l2-2;
2, ? ?去掉a,b中的小數點,(a,b小數點后移,使a,b變為整數)
3, ? ?計算c=a*b; (同整數的大數相乘算法)
4, ? ?輸出c,(注意在輸出倒數第l個數時,輸出一個小數點。若是輸出的數少于l個,就補0)
du51(郁郁思揚)的答案:
變為整數求就行了.輸入的時候記一下,小數點位置..輸出再做點文章就行了.
下面的是大整數的運算.
#include<iostream>
using namespace std;
#define MAX 10000
struct Node{
int data;
Node *next;
};
void output(Node *head)
{
if(!head->next&&!head->data)return;
output(head->next);
cout<<head->data;
}
void Mul(char *a,char *b,int pos)
{
char *ap=a,*bp=b;
Node *head=0;
head=new Node;head->data=0,head->next=0; ? //頭
Node *p,*q=head,*p1;
int temp=0,temp1,bbit;
while(*bp) ? ? ? ? ? ? ? ?//若乘數不為空 ,繼續.
{
p=q->next;p1=q;
bbit=*bp-48; ? ? ? ? ?//把當前位轉為整型
while(*ap||temp) ? ? ? ? ? ?//若被乘數不空,繼續
{
if(!p) ? ? ? ? ? ?//若要操作的結點為空,申請之
{
p=new Node;
p->data=0;
p->next=0;
p1->next=p;
}
if(*ap==0)temp1=temp;
else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
p1->data=temp1%10; ? ?//留當前位
temp=temp1/10; ? ?//進位以int的形式留下.
p1=p;p=p->next; ? ? ? ? ? ? ? ? //被乘數到下一位
}
ap=a;bp++;q=q->next; ? ? ? ? ? ? ? ?//q進下一位
}
p=head;
output(p); ? ? ? ? ? ? ? ? ? //顯示
cout<<endl;
while(head) ? ? ? ? ? ? ? ? //釋放空間
{
p=head->next;
delete head;
head=p;
}
}
int main()
{
cout<<”請輸入兩個數”<<endl;
char test1[MAX],test2[MAX];
cin.getline(test1,MAX,’\n’);
cin.getline(test2,MAX,’\n’);
Mul(strrev(test1),strrev(test2));
system(“PAUSE”);
return 0;
}
上面大整數已經寫了.你加幾個東西就行了.
#include<iostream>
using namespace std;
#define MAX 10000
struct Node{
int data;
Node *next;
};
void output(Node *head,int pos)
{
if(!head->next&&!head->data)return;
output(head->next,pos-1);
cout<<head->data;
if(!pos)cout<<”.”;
}
void Mul(char *a,char *b,int pos)
{
char *ap=a,*bp=b;
Node *head=0;
head=new Node;head->data=0,head->next=0; ? //頭
Node *p,*q=head,*p1;
int temp=0,temp1,bbit;
while(*bp) ? ? ? ? ? ? ? ?//若乘數不為空 ,繼續.
{
p=q->next;p1=q;
bbit=*bp-48; ? ? ? ? ?//把當前位轉為整型
while(*ap||temp) ? ? ? ? ? ?//若被乘數不空,繼續
{
if(!p) ? ? ? ? ? ?//若要操作的結點為空,申請之
{
p=new Node;
p->data=0;
p->next=0;
p1->next=p;
}
if(*ap==0)temp1=temp;
else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
p1->data=temp1%10; ? ?//留當前位
temp=temp1/10; ? ?//進位以int的形式留下.
p1=p;p=p->next; ? ? ? ? ? ? ? ? //被乘數到下一位
}
ap=a;bp++;q=q->next; ? ? ? ? ? ? ? ?//q進下一位
}
p=head;
output(p,pos); ? ? ? ? ? ? ? ? ? //顯示
cout<<endl;
while(head) ? ? ? ? ? ? ? ? //釋放空間
{
p=head->next;
delete head;
head=p;
}
}
int main()
{
cout<<”請輸入兩個數”<<endl;
char test1[MAX],test2[MAX],*p;
int pos=0;
cin.getline(test1,MAX,’\n’);
cin.getline(test2,MAX,’\n’);
if(p=strchr(test1,’.'))
{
pos+=strlen(test1)-(p-test1)-1;
do
{
p++;
*(p-1)=*p;
}while(*p);
}
if(p=strchr(test2,’.'))
{
pos+=strlen(test2)-(p-test2)-1;
do
{
p++;
*(p-1)=*p;
}while(*p);
}
Mul(strrev(test1),strrev(test2),pos);
system(“PAUSE”);
return 0;
}
4.寫一個病毒
cout<<”一個病毒”<<endl;
(開玩笑的,沒搞過,^_^)
5.讓你在100000000個浮點數中找出最大的10000個,要求時間復雜度優。
//本算法使用快排,O(n*lg(n))
//最低可以找到線性算法,使用預先區域統計劃分!類試于構造Quad Trees! 寫起來代碼會長些!
#include <stdio.h>
#include <stdlib.h>
#define Max 100000000
int a[Max+10];
int cmp( const void *a, const void *b)
{
int *x = ( int *) a;
int *y = ( int *) b;
return *x-*y;
}
int main()
{
int n=0;
while (scanf(“%d”,&a[n])==1) ? ? n++;
qsort(a,n,4,cmp);
for ( int i=0;i<3;i++) ? ? printf(“%d”,a[ i ]);
return 1;
}
5 、有 A 、 B 、 C 、 D 四個人,要在夜里過一座橋。他們通過這座橋分別需要耗時 1 、 2 、 5 、 10 分鐘,只有一支手電,并且同時最多只能兩個人一起過橋。請問,如何安排,能夠在 17 分鐘內這四個人都過橋?
Solution:關鍵是時間最長的兩個人必須同時過橋
The First Time : ? ? ? A(1) 和 B(2) 過橋, A(1) 返回 Cost : 1+2
The Second Time : ? ?C(5) 和 D(10) 過橋, B(2) 返回 Cost : 10+2
The Third Time ? ? A(1) 和 B(2) 過橋 Cost : 2
Total Time Cost : ? ?(1+2)+(10+2)+2=17 minutes
1.請定義一個宏,比較兩個數a、b的大小,不能使用大于、小于、if語句
2.如何輸出源文件的標題和目前執行行的行數
3.兩個數相乘,小數點后位數沒有限制,請寫一個高精度算法
數據控制語言(DCL):是用來設置或者更改數據庫用戶或角色權限的語句,這些語句包括GRANT、DENY、REVOKE等語句,在默認狀態下,只有sysadmin、dbcreator、db_owner或db_securityadmin等角色的成員才有權利執行數據控制語言。
數據操縱語言(DML):數據操縱語言是指用來查詢、添加、修改和刪除數據庫中數據的語句,這些語句包括Select、Insert、Update、Delete等。在默認情況下,只有sysadmin、dbcreator、db_owner或db_datawriter等角色的成員才有權利執行數據操縱語言。
數據定義語言(DDL):數據定義語言是指用來定義和管理數據庫以及數據庫中的各種對象的語句,這些語句包括Create、Alter和Drop等語句。在SQL Server 2000中,數據庫對象包括表、視圖、觸發器、存儲過程、規則、缺省、用戶自定義的數據類型等。這些對象的創建、修改和刪除等都可以通過使用Create、Alter、Drop等語句來完成。
編譯執行和解釋執行的區別:
1、解釋程序
所謂解釋程序是高級語言翻譯程序的一種,它將源語言(如BASIC)書寫的源程序作為輸入,解釋一句后就提交計算機執行一句,并不形成目標程序。就像外語翻譯中的“口譯”一樣,說一句翻一句,不產生全文的翻譯文本。這種工作方式非常適合于人通過終端設備與計算機會話,如在終端上打一條命令或語句,解釋程序就立即將此語句解釋成一條或幾條指令并提交硬件立即執行且將執行結果反映到終端,從終端把命令打入后,就能立即得到計算結果。這的確是很方便的,很適合于一些小型機的計算問題。但解釋程序執行速度很慢,例如源程序中出現循環,則解釋程序也重復地解釋并提交執行這一組語句,這就造成很大浪費。
2、編譯程序
這是一類很重要的語言處理程序,它把高級語言(如FORTRAN、COBOL、Pascal、C等)源程序作為輸入,進行翻譯轉換,產生出機器語言的目標程序,然后再讓計算機去執行這個目標程序,得到計算結果。
編譯程序工作時,先分析,后綜合,從而得到目標程序。所謂分析,是指詞法分析和語法分析;所謂綜合是指代碼優化、存儲分配和代碼生成。為了完成這些分析綜合任務,編譯程序采用對源程序進行多次掃描的辦法,每次掃描集中完成一項或幾項任務,也有一項任務分散到幾次掃描去完成的。
值得一提的是,大多數的編譯程序直接產生機器語言的目標代碼,形成可執行的目標文件,但也有的編譯程序則先產生匯編語言一級的符號代碼文件,然后再調用匯編程序進行翻譯加工處理,最后產生可執行的機器語言目標文件。
在實際應用中,對于需要經常使用的有大量計算的大型題目,采用招待速度較快的編譯型的高級語言較好,雖然編譯過程本身較為復雜,但一旦形成目標文件,以后可多次使用。相反,對于小型題目或計算簡單不太費機時的題目,則多選用解釋型的會話式高級語言,如BASIC,這樣可以大大縮短編程及調試的時間。
最后的附加題是一個“背包問題”
?
總結
- 上一篇: 国内外主流的三维GIS软件集锦
- 下一篇: 武警部队公安应急人防安监三维可视化交互电