1. 已知x,不用+,-,*,/符號,計算出x+1的值;
當時的分析就是分情況最后一位是0或1,最后總結出來只要把從右開始數,第一個0位置1就行了,可是我當時沒有想出代碼來,再此瞭望下面的代碼,學習一下。。
解答:
1. 假設是整數
int Add(int x)
{
int n = x, b =1;
while( (n & b)) {
n = n& (~b); //將0后的1也轉化為0
b = b < <1;
}
return (n | b);
}
還有一種解法是
x=abs((float)~x);
2. 檢驗一個整數是否為2的n次方數,要求用一行代碼,而且不能使用循環語句。
解法:
x&(x-1)? false:true,
這個題就不知道該咋總結了,應該說是老題了,位運算,頭一次見的時候,可以多試試,看看有什么規律,還是可以發現的。。
topic.csdn.net\u\20081029\10\ee84a378-bdd0-41ec-a4af-916ba59baaba.html
3.2個數組,元素數值按從小到大排序,
a[]={0,2,4,5,7,8,9,.....1000}, 從0到1000,到但有缺漏的.有900個元素.
b[]={0,1,2,3,4,5,6,.....1000}, 從0到1000,無缺漏,1001個元素
請建立一個對應的數組,元素個數等于b數組個數,也是從小大到排序.如果b數組里的數字在a里面,則數值等于b數組里的,
如果不在,則對應位為0.例如c={0,0,2,0,4,5.....1000}
請設計最優方案.
解答:
這個題出眼一想,把b中每一個元素去和a里面找,有的話,填c,沒有的話,填0.。算一下復雜度,1000*900~~
如此簡單~~
再想想,題不可能這么簡單,要這樣都會了。。都聘用了,還刷選啥,,
那么用邏輯思維怎么做這道題呢,這個題主要是求c,那么c有什么特點呢?(專注于未知數),,里面有0和一些數,關鍵就在這些數,有什么特點呢,可以想到當a里面有時,那么c就有(b始終都有),,,靈光一閃,怎么象函數泥,,是不是映射呢,每個a映射到c
繼續,a當函數的參數,c[a[i]]=一個非零數。。這個非零數是多少呢,特例法試試:當a[i]取2時,c[2]=2,當a[3]=3,c[3]=0;a[4]=4,c[4]=4,,可以發現這個是個y=x函數,當b中的一個數,a中有時,那么這時c[i]=b[i]=a[i];沒有時,a[i]=0,那么c[0]=0..。。。。。。。。
進而得到答案:
先對c所有賦初值0
完了,掃描一下a,對每個a的元素,使用:c[a[i]] = a[i];
topic.csdn.net\u\20090302\18\2A7DA801-42A9-49AE-9759-420CB6BF29F0.html
3. 一億個整數里找出現次數最多的前N個數
解答:
首先必須明確的是,必須遍歷全部的的整數才能找出,不要想什么特別的技巧,可以非??斓恼页鰜怼?。
直觀的,用快排將一個數排序,然后取前n個,,需要明確的是,快排不是穩定的排序,有時它的復雜度是很高的,可以達到n^2,想一想,一億的平方,不是很小的數,,,這里有個方法“位圖法”,很常用的方法:
1億==100M
開辟200M內存夠了...
array[100000000]
初始化為0
從文件里讀入數據到source[100000000]數組中。
遍歷source[]:
array[source[i]-1]++;
i=0...99999999
定義數組
result[N]
問題簡化為:從array中選出N個下標值,它們對應了array中存儲的最大的N個數。
比如array[0]=50000000,array[1]=50000000,那么result[0]=0+1=1
result[1]=1+1=2
發現上面兩題之所以用嵌套數組,一個共同點就是,他們的元素是全的(0..*),本體的解法很巧妙,,,,我就不多廢話了,可以多體會體會。。
topic.csdn.net\u\20080821\21\f6d4cd24-f878-419c-adc3-0928ffd3e394.html
4.求第K大的素數
如題 k=1 輸出 2 k=2 輸出 3
1= <k <=10000
時間限制 :1S
這個題應該不是所謂的面試題,應該算一道acm,不過感覺這道題很有意思,所以也就寫到這里了。。
我當時是上外方課時想這道題的,剛開始的時候顯然走了彎路,后來才意識到,這個是求第k個素數,所以需要精確的計算到第k個(素數產生并沒有什么大致的規律),而不是大致的估算。。那么下面我的思路就清晰了,,只能一個一個判斷了。。。
#include <iostream>
using namespace std;

long f(int *A,int k)


{
if (k==1)

{
return 2;
}
A[0]=2;
int i=3;
int index;
for (;A[k-1]==0;i+=2)

{
for (index=0;A[index]!=0;++index)

{
if (i%A[index]==0)

{
break;
}
}
if (A[index]==0)

{
A[index]=i;
}
}
return A[k-1];
}

int main()


{
int n=10000;
int *A=new int[n];
for (int i=0;i<=n-1;++i)

{
A[i]=0;
}
int k;
cin>>k;
cout<<f(A,k);
system("pause");
return 0;
}

這個是lz的代碼,而我的想法差不多,唯一的區別是我是想弄個函數來判斷是否是素數,而她是除以每個前面的素數來判斷。。。我們倆的效率都不是很高,看下面的:
private int[] GetPrimeList(int upperValue)

{
List<int> PrimeList = new List<int>();
bool[] flags = new bool[upperValue + 2];

for (int i = 2; i <= (int)Math.Sqrt(upperValue); i++)

{
if (!flags[i])

{
for (int j = i * i; j <= upperValue; j += i)

{
flags[j] = true;
}
}
}

for (int i = 2; i < upperValue; i++)

{
if (!flags[i])

{
PrimeList.Add(i);
}
}

return PrimeList.ToArray();
}


這個叫litaoye果然很nb,他寫的代碼實在是比我們的好多了,可以看出來,他對素數的理解顯然比我深多了,我只想著怎么數素數,素數有什么規律嗎,,而他直接想到那些不是素數,,反用了書上的思想。。。很好很強大,,需要好好學習。。。
topic.csdn.net\u\20090225\22\065378f6-4cf7-4d2d-9997-ddb8a2481347.html
1. 問題描述:按順序輸入兩個數a,b,轉換成八位二進制表示a',b',再將這兩個八位二進制數拼接成一個十六位二進制數c',規則為:將b'的八位放在c'的高位,a'的八位放到a'的地位,最后將十六位二進制數c'轉換為十進制數c輸出。例如:輸入23(0001 0111)、14(0000 1110),c'=(0000 1110 0001 0111),最后輸出c=3607,
這個題,我一看就準備用bitset了,然后直接就被題目給誤導了。。。汗,,
看來自己還是對這些數的底層不熟,,組成原理沒學好,,明顯的,,
進制的加減其實結果都是一樣,說那么多廢話不過是迷惑我們。。看正解
int _tmain(int argc, _TCHAR* argv[])


{
int a = 23;
int b = 14;

cout<<a + (b<<8)<<endl;

return 0;

}

topic.csdn.net\u\20090223\20\907ff5e3-62e4-4963-8f72-279840072b50.htm