力扣日常练习

旋转数组(简单)

给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

解题:

思路:将数组向右移动k个位置,那么首先我们的思路便是申请一个额外的数组,来预存数组中的元素,紧接着再对原数组进行操作,A[(i + k)%size] = B[i]。

class Solution {
public:
    void rotate(vector& nums, int k) {
       vector numscopy(nums.begin(), nums.end());
       int size = nums.size();
       for (int i = 0; i < size; ++i)
       {
           nums[(i+k)%size] = numscopy[i];
       }
    }
};

但是这种方法会需要O(n)的空间复杂度,因此我们思考另一种方法,原地修改数组本身:

class Solution {
public:
    void rotate(vector& nums, int k) {
       int len=nums.size();
       //旋转前size-k个元素
       reverse(nums.begin(), nums.end() - k%len);
       //旋转后k个元素
       reverse(nums.end()- k%len,nums.end());
       //旋转整个数组
       reverse(nums.begin(),nums.end());
    }
};

颠倒二进制位(简单)

颠倒给定的 32 位无符号整数的二进制位。

解题:

如代码所示:

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t res = 0;
        for (int i = 0; i < 32; ++i)
        {
            res <<= 1;
            res |= (1 & n);
            n >>= 1;
        }
        return res;
    }
};

快乐数(简单)

编写一个算法来判断一个数是不是“快乐数”。

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。

解题:

这道题涨知识了,首先需要明确的是,若输入数字为"快乐数"那么一定会出现结果变为1的情况,若不为则会进到一个无限循环当中,由此我们找到了突破口,采用快慢指针的方法,来找到循环当中的"交点",若该交点处的值为1,则为快乐数,若不为则不是。

class Solution {
public:
    int bitSquareSum(int n) {
        int sum = 0;
        while(n > 0)
        {
            int bit = n % 10;
            sum += bit * bit;
            n = n / 10;
        }
        return sum;
    }
    
    bool isHappy(int n) {
        int slow = n, fast = n;
        do{
            slow = bitSquareSum(slow);
            fast = bitSquareSum(fast);
            fast = bitSquareSum(fast);
        }while(slow != fast);
        
        return slow == 1;
    }
};

移除链表元素(简单)

删除链表中等于给定值 val 的所有节点。

解题:

简单的链表操作题,利用到了哨兵结点。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* flag = new ListNode(0);
        flag->next = head;
        ListNode* cur = flag;
        while(cur->next != nullptr) {
            if (cur->next->val == val) {
                cur->next = cur->next->next;
            }
            else
                cur = cur->next;
        }
        return flag->next;
    }
};

 

你可能感兴趣的:(随便写写)