【11-15】剑指offer

11. 题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    可以采用移位的方式,也可以采用如下的方式

//该方式较好

class Solution {

public:

     int  NumberOf1(int n) {

         int count = 0;

         while(n)

         {

             count++;

             n = n&(n-1);

         }

         return count;

     }

};

//移位方式

class Solution {

public:

     int  NumberOf1(int n) {

         int count = 0;

         unsigned int flag = 1;

         while(flag)

         {

             if(n & flag)

                count++;

             flag = flag<<1;

         }

         return count;

     }

};


 

12. 题目描述

给定一个double类型的浮点数baseint类型的整数exponent。求baseexponent次方。

分析:1.是否有意义的判断?

      2.double类型的数据与0的比较

      3.指数为负数时的处理

      4.两种方法计算一个正数的n次幂

#include <iostream>

using namespace std;

 

//输入错误标志

bool g_bFlagError = false;

 

class Solution 

{

public:

     double Power(double base, int exponent) {

    //输入无意义,由于浮点数有精度问题,所以判断等于0要判断值是否在一个较小的区间

    if(base < 0.0000001 && base > -0.0000001)

    {

if(0 == exponent)

{

cout<<"No meaning\n";

g_bFlagError = true;

return 0;

}

}

//e^0 = 1

if((base >= 0.0000001 || base <= -0.0000001) && exponent == 0)

return 1;

 

         //有意义的情况

unsigned int nAbsExponent = (unsigned int) exponent;

if(exponent < 0)

nAbsExponent = (unsigned int)(-exponent);

double result = 1.0;

//计算,若要提高运算速度可以采用递归的方式实现

//while(nAbsExponent>0)

//{

//result = result*base;

//nAbsExponent--;

//}

result = PowerWithUsignedexponent(base,nAbsExponent);

         //若指数为负数时需要处理

if(exponent < 0)

result = 1.0/result;

return result;

     }

 

double PowerWithUsignedexponent(double base, int exponent)

{

//递归截止条件

if(exponent == 0)

return 1;

if(exponent == 1)

return base;

//计算

int result = PowerWithUsignedexponent(base, exponent>>1);

result *= result;

 

//如果指数是奇数

if(exponent & 0x1 == 1)

result *= base;

 

return result;

}

};

 

int main()

{

Solution s;

cout << s.Power(0,0)<<endl;

cout << s.Power(2,0)<<endl;

 

cout << s.Power(4,-2)<<endl;

cout << s.Power(4,2)<<endl;

 

return 0;

}

 

13. 题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

    注意:相对位置不变!

 

class Solution

 {

public:

void reOrderArray(vector<int> &array) 

{

if(array.size() == 0)

return;

 

//定义连个临时队列

queue<int> odd;

queue<int> even;

vector<int>::iterator ite = array.begin();

for(; ite != array.end(); ite++)

{

//偶数

if((*ite & 0x1) == 0)

even.push(*ite);

else

odd.push(*ite);

}

ite = array.begin();

while(!odd.empty())

{

*ite = odd.front();

//cout<<*ite<<endl;

odd.pop();

ite++;

}

while(!even.empty())

{

*ite = even.front();

//cout<<*ite<<endl;

even.pop();

ite++;

}

}

};

 

int main()

{

Solution s;

//初始化容器

vector<int> array(8);

vector<int>::iterator ite = array.begin();

for(; ite != array.end(); ite++)

{

cout<<"Please input the array:";

cin>>*ite;

}

//操作

s.reOrderArray(array);

//输出

cout<<"***********************************"<<endl;

ite = array.begin();

for(; ite != array.end(); ite++)

{

cout<<*ite<<endl;

}

 

return 0;

}

 

14. 题目描述

输入一个链表,输出该链表中倒数第k个结点。

 

#include <iostream>

using namespace std;

 

struct ListNode {

int val;

struct ListNode *next;

ListNode(int x) :

val(x), next(NULL) {

}

};

 

class Solution {

public:

    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {

//处理链表为NULL以及k=0的情况

if(pListHead == NULL || k == 0)

return NULL;

//定义两个指针,其中pHead指向链表前部分,pBehind指向链表后面部分

ListNode *pAhead = pListHead;

ListNode *pBehind = pListHead;

int i = 0;

for( ; i < k-1; i++)

{

if(pBehind->next != NULL)

pBehind = pBehind->next;

else

return NULL;

}

 

//当链表满足条件时

while(pBehind->next != NULL)

{

pBehind = pBehind->next;

pAhead = pAhead->next;

}

return pAhead;

    }

};

 

int main()

{

int val;

ListNode *pListHead = NULL;

ListNode *ptemp = NULL;

for(int i = 0; i < 10; i++)

{

cout<<"Please input val:";

cin>>val;

ListNode *node = new ListNode(val);

if(i == 0)

{

ptemp = pListHead = node;

}

else

{

ptemp->next = node;

ptemp = node;

}

}

 

Solution s;

ListNode *result = s.FindKthToTail(pListHead, 12);

if(result!=NULL)

cout<<result->val<<endl;

else

cout<<"NULL"<<endl;

 

result = s.FindKthToTail(pListHead, 0);

if(result!=NULL)

cout<<result->val<<endl;

else

cout<<"NULL"<<endl;

 

     result = s.FindKthToTail(pListHead, 5);

if(result!=NULL)

cout<<result->val<<endl;

else

cout<<"NULL"<<endl;

 

result = s.FindKthToTail(NULL, 5);

if(result!=NULL)

cout<<result->val<<endl;

else

cout<<"NULL"<<endl;

 

return 0;

}

 

15. 题目描述

输入一个链表,反转链表后,输出链表的所有元素。

考虑问题要全面: 链表为NULL的处理

               链表只有1个结点时的处理

               链表有2个或者2个以上节点的处理

               (需要使用3个指针)

class Solution {

public:

    ListNode* ReverseList(ListNode* pHead) {

//如果链表为NULL,则返回NULL

if(pHead == NULL)

return NULL;

//如果链表只有1个结点

if(pHead->next == NULL)

return pHead;

//如果链表有2个或者2个以上的结点

ListNode *pPre = pHead;

ListNode *pReverseHead = pHead->next;

ListNode *pBehind = NULL;

 

while(pReverseHead != NULL)

{

if(pReverseHead->next != NULL)

pBehind = pReverseHead->next;

else

pBehind = NULL;

//如果是pHead中的第一个结点,那么其next指针为NULL

if(pPre == pHead)

pPre->next = NULL;

//将中间指针的next指向前一个指针,然后三个指针向前移动一个位置

pReverseHead->next = pPre;

pPre = pReverseHead;

pReverseHead = pBehind;

}

//如果中间指针为NULL,那么意味着翻转后链表的头结点为该节点的前一个结点

if(pReverseHead == NULL)

pReverseHead = pPre;

pHead = pReverseHead;

return pHead;

    }

};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值