面试题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++;
}
}
}
479

被折叠的 条评论
为什么被折叠?



