快到年底了,考慮到一些情況,加之現在工作業務沒那麼多了,本著想在技術上想在多學點東西的想法,突然間萌生了想換工作的想法,恰好一不錯的公司Hr給我說他們在招人,於是我就偷偷的給了份簡歷,時隔幾天她給了我一份筆試題,我一看有算法題,這是我最頭疼的問題,我不反對面試算法,但是我感覺很多用人單位還是要本著自己的業務水平去面試,招適合本公司業務處理,相對比較實用又符合發展的人才就行了,當你真正拿出一些很高深的算法去面試的時候,我感覺你要看看你開出來招人的預算是不是能達到答出來這些題的待遇,是不是你現在的業務就需要這麼高深的技術支撐,同時是不是能給一些比方說像我這種級別低點的大眾化程序員次機會!下面我列出面試題也求園裡的高手求解下,本人求知若渴,只想做在技術上的交流,因為我確實在算法上很不在行,本著虛心求教的態度,我想在這方面多學習下。
要求30分鐘
編程語言不限,允許有小的語法錯誤;
在程序前面簡單寫出編程思路;
1、編寫一個函數,不用臨時變量,直接交換兩個數。
2、用數組實現一個容量為n的隊列,要求進隊列和出隊列的時間復雜度都為O(1)。
3、寫一個函數,在給定的n個數字中,找出最小的m個,其中m<n。請一並給出算法的時間復雜度。
一下是我發給他們的答案
class Program
{
static void Main(string[] args)
{
//第一題
int numA = 321;
int numB = 8765;
numA = numA ^ numB;
numB = numB ^ numA;
numA = numA ^ numB;
Console.WriteLine(numA);
Console.WriteLine(numB);
//第二題
var n = 100;
var arr = new string[n];
var index = 0;
var last = 0;
//入隊列
Action<string> push = s =>
{
var nIndex = index + 1;
nIndex = nIndex == n ? 0 : nIndex;
if (nIndex == last)
{
Console.WriteLine("隊列已滿");
return;
}
arr[index] = s;
index = nIndex;
};
///出隊列
Func<string> pop = () =>
{
string result;
if (index == last)//隊列中無數據
{
result = null;
}
result = arr[last];
last++;
last = last == n ? 0 : last;
return result;
};
push("AAA");
push("BBB");
push("CCC");
push("DDD");
Console.WriteLine(pop());
Console.WriteLine(pop());
Console.WriteLine(pop());
Console.WriteLine(pop());
//第三題 算法復雜度O(n) 因為時間關系目前只支持正整數
int[] arrInt = new[] { 1, 2, 4, 6, 8, 9, 4, 2, 4, 7, 9 };
int n1 = arrInt.Length;
Func<int, int[]> func = m =>
{
var max = 0;
foreach (var item in arrInt)
{
max = max < item ? item : max;
}
var nArr = new bool[max + 1];
foreach (var item in arrInt)
{
nArr[item] = true;
}
var result = new int[m];
var indexInt = 0;
for (var i = 0; i < nArr.Length; i++)
{
if (nArr[i])
{
result[indexInt] = i;
indexInt++;
}
if (indexInt == m)
{
break;
}
}
return result;
};
var tmp = func(3);
foreach (var item in tmp)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
以上是我給過去的答案,最後的結果是沒通過,但是我也不能在厚著臉皮去問為什麼了,畢竟那邊是人事不是技術,我感覺我第三題的算法可能有問題,我是拿了空間換時間,要是輸出重復的就實現不了了,算是我鑽了個漏洞吧,哈哈,雖然實現了功能要求,但是我確實不知道怎麼寫比較好一點,希望園子裡的高手能給我指點下,第三題應該怎麼寫?雖然沒通過,但是我也想在一次面試中找到自己的不足,這道題以我目前的水平不足以有更好的寫法了,所以想求解更好的答案
static int [] zhaoQian=new int [7];
public static string f(int a, int b)
{
int c = b - a;
string s = "所付錢數不足!";
if (c > 0)
{
zhaoQian[0] = c / 100;
zhaoQian[1] = c % 100 / 50;
zhaoQian[2] = c % 50 / 20;
zhaoQian[3] = c % 20 / 10;
zhaoQian[4] = c % 10 / 5;
zhaoQian[5] = c % 5 / 2;
zhaoQian[6] = c % 2;
}
else
{
return s;
}
s = "找回錢數"+c.ToString()+"其中:百元" + zhaoQian[0].ToString() + "張;五十元" + zhaoQian[1].ToString() +
"張;二十元" + zhaoQian[2].ToString() + "張;十元" + zhaoQian[3].ToString() +
"張;五元" + zhaoQian[4].ToString() + "張;兩元" + zhaoQian[5].ToString() +
"張;一元" + zhaoQian[6].ToString() + "張";
return s;
}
public static void Main()
{
Console.Write(f(123,600));
Console.Read();
}
每人選三個,最多的三個人當總統。 我瞎想的,不一定對哦。