牛客网刷题3(python)

博客包含多道数据结构编程题。如计算整数二进制中1的个数,用减1再与原数做与运算;实现浮点数的整数次方用C++代码;调整数组中奇偶顺序用冒泡排序;还有链表相关操作,如输出倒数第k个结点、反转链表等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

思路:举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。

class Solution:
    def NumberOfl(self,n):
        count = 0
        if n<0:
           n = n & 0xffffffff //负数补码
        while n:
           n = n & (n-1)
           count += 1
        return count
        

12.给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

class Solution:
    def Power(self, base, exponent):
        # write code here
        return pow(base, exponent)

直接调用函数的方式太丑陋了,因此换C++代码实现。

/* 方法1,递归调用 */
class SOlution{
public:
        double Power(int base, double exponent){
        
        if(exponent>0)
        {
            if(exponent == 1)
                return base;
            if(exponent %2 == 0)
                return Power(base, exponent/2)*Power(base, exponent/2);
            else
                return Power(base, exponent/2)*Power(base, exponent/2+1);    
        }
        else if(exponent == 0)
        {
            return 1;
}
        else
            {return 1/Power(base, 0-exponent);}
    }


}

/* 方法2 */
class Solution {
public:
    double Power(double base, int exponent) {
        long long p = abs((long long) exponent);
        double r = 1.0;
        while (p)
        {
            if(p & 1)        //p与1作与运算非零
                r *= base;
            base *= base;
            p >>= 1;       //移位
        }
        return (exponent > 0)? r:1/r;
        
    }
};

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

思路:这其实是一个冒泡排序,将数组中的元素进行判断,若某个位置的数为奇数,且该数前一个元素为偶数,将互换。

class Solution:
    def reOrderArray(self, array):
        for i in range(len(array)):
            for j in range(len(array-1),i,-1):   //j从len(array-1)开始,逆序
                if array[j]%2 == 1 and array[j-1]%2 == 0:
                    temp = array[j-1]
                    array[j-1] = array[j]
                    array[j] = temp
        return array


/* 方法2:利用双向队列 */
from collections import deque
class Solution:
    def reOrderArray(self, array):
        # write code here
        odd = deque()
        x = len(array)
        for i in range(x):
            if array[i]%2 == 0:
                odd.append(array[i])
            if array[x-i-1]%2 == 1:   //逆序,以保证顺序不变
                odd.appendleft(array[x-i-1])
        return list(odd)

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

/*    */
class Solution:
    def Search(self, head, k)
        l = []
        while head != None:
            l.append(head)
            head = head.next
        if len(l<k) or k<1:
            return
        return l[-k]

15.输入一个链表,反转链表后,输出新链表的表头。

思路:递归实现

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None
class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        last = None
        if not pHead or not pHead.next:
                return pHead
        while pHead: 
                temp = pHead.next   //将pHead.next值赋给temp防止链表断裂
                pHead.next = last
                last = pHead
                pHead = temp
        return last

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值