【劍指offer】3.3 代碼的完整性

面試題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++;
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章