面試題12:數值的整數次方
題目:實現函數double Power(double base,int exponent),求base的exponent次方。不得使用庫函數,同時不需要考慮大數問題。
解答:代碼如下:
//判斷兩個浮點數是否相等有誤差,需要特殊處理
bool equal(double num1,double num2)
{
bool res = false;
if((num1 - num2 > -0.0000001) &&(num1 - num2 < 0.0000001))
{
res = true;
}
return res;
}
double power(double base,unsigned int exponent)
{
double result = 1.0;
while(exponent)
{
result *= base;
exponent--;
}
return result;
}
double Power(double base, int exponent)
{
//如果底數和指數同時爲0或底數爲0指數小於0則直接返回
if(equal(base,0.0) && exponent <= 0)
{
return 0.0;
}
unsigned int absExponent = (unsigned int)(abs(exponent));
double result = power(base,absExponent);
if(exponent < 0)
{
result = 1.0 / result;
}
return result;
}
題目13:在O(1)時間刪除鏈表結點
題目:給定單向鏈表的頭指針和一個結點指針,定義一個函數在O(1)時間刪除該結點。鏈表結點與函數的定義如下:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
void DeleteNode(ListNode **pListHead,ListNode *pToBeDeleted);
解答:代碼如下:
void DeleteNode(ListNode **pListHead,ListNode *pToBeDeleted)
{
if(NULL == pListHead || NULL == pToBeDeleted)
{
return ;
}
//要刪除的結點不是尾節點
if(pToBeDeleted->m_pNext != NULL)
{
ListNode *pNext = pToBeDeleted->m_pNext;
pToBeDeleted->m_nValue = pNext->m_nValue;
pToBeDeleted->m_pNext = pNext->m_pNext;
delete pNext;
pNext = NULL;
}
//鏈表只有一個結點,刪除頭節點(也是尾節點)
else if(*pListHead == pToBeDeleted)
{
delete pToBeDeleted;
pToBeDeleted = NULL;
*pListHead = NULL;
}
//鏈表中有多個節點,刪除的是尾節點
else
{
ListNode *pNode = *pListHead;
while(pNode->m_pNext != pToBeDeleted)
{
pNode = pNode->m_pNext;
}
delete pToBeDeleted;
pToBeDeleted = NULL;
pNode->m_pNext = NULL;
}
}
面試題14:調整數組順序使奇數位於偶數前面
題目: 輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。
解答:代碼如下:
void reOrderArray(vector<int> &array)
{
if(array.size() == 0)
{
return ;
}
int len = array.size();
int k = 0;//記錄當前數組前半部分的奇數個數
for(int i = 0;i < len;i++)
{
//判斷是否爲奇數
if(array[i] % 2 == 1)
{
int j = i;
//利用插入排序
int tmp = array[j];
while(j > k)
{
array[j] = array[j-1];
j--;
}
array[j] = tmp;
k++;
}
}
}