LeetCode学习-第三十九天

50 篇文章 0 订阅
28 篇文章 0 订阅

第三十九天

我使用的C++,错误的地方请见谅,文章初衷仅用来督促本人学习,如果恰巧能够给你带来帮助,我会十分开心。

一、1006. 笨阶乘

通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。

相反,我们设计了一个笨阶乘 clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。

例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。然而,这些运算仍然使用通常的算术运算顺序:我们在任何加、减步骤之前执行所有的乘法和除法步骤,并且按从左到右处理乘法和除法步骤。

另外,我们使用的除法是地板除法(floor division),所以 10 * 9 / 8 等于 11。这保证结果是一个整数。

实现上面定义的笨函数:给定一个整数 N,它返回 N 的笨阶乘。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/clumsy-factorial
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int clumsy(int n) {
    //n个数n次操作,先算乘除后算加减,利用栈来控制顺序
    stack<int> stk;
    stk.push(n);
    n--;
    int index = 0;
    while (n > 0){
        if (index % 4 == 0){
            stk.top() *= n;//第一位为乘
        } else if (index % 4 == 1){
            stk.top() /= n;//第二位为除
        } else if (index % 4 == 2){//加减先入栈再说
            stk.push(n);
        } else{
            stk.push(-n);
        }
        index ++;
        n--;
    }
    int sum = 0;
    while (!stk.empty()){//其余加减数弹出
        sum += stk.top();
        stk.pop();
    }
    return sum;

    }
};

二、2526. 找到数据流中的连续整数

给你一个整数数据流,请你实现一个数据结构,检查数据流中最后 k 个整数是否 等于 给定值 value 。

请你实现 DataStream 类:

DataStream(int value, int k) 用两个整数 value 和 k 初始化一个空的整数数据流。
boolean consec(int num) 将 num 添加到整数数据流。如果后 k 个整数都等于 value ,返回 true ,否则返回 false 。如果少于 k 个整数,条件不满足,所以也返回 false 。

输入:
[“DataStream”, “consec”, “consec”, “consec”, “consec”]
[[4, 3], [4], [4], [4], [3]]
输出:
[null, false, false, true, false]

解释:
DataStream dataStream = new DataStream(4, 3); // value = 4, k = 3
dataStream.consec(4); // 数据流中只有 1 个整数,所以返回 False 。
dataStream.consec(4); // 数据流中只有 2 个整数
// 由于 2 小于 k ,返回 False 。
dataStream.consec(4); // 数据流最后 3 个整数都等于 value, 所以返回 True 。
dataStream.consec(3); // 最后 k 个整数分别是 [4,4,3] 。
// 由于 3 不等于 value ,返回 False 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-consecutive-integers-from-a-data-stream
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class DataStream {
    int n, x, m;
public:
    DataStream(int value, int k) {
        n = k;
        m = value;
        x = 0;

    }
    
    bool consec(int num) {
        if (num == m)
            x++;//如果新加入的num与value相同加一
        else x = 0;//出现不相同的计数置0
        return x >= n;

    }
};

/**
 * Your DataStream object will be instantiated and called as such:
 * DataStream* obj = new DataStream(value, k);
 * bool param_1 = obj->consec(num);
 */
 //摘自leetcode账号:汪乐平 比赛代码
 //仅作学习借鉴使用,如有侵权联系删除

三、2527. 查询数组 Xor 美丽值

给你一个下标从 0 开始的整数数组 nums 。

三个下标 i ,j 和 k 的 有效值 定义为 ((nums[i] | nums[j]) & nums[k]) 。

一个数组的 xor 美丽值 是数组中所有满足 0 <= i, j, k < n 的三元组 (i, j, k) 的 有效值 的异或结果。

请你返回 nums 的 xor 美丽值。

注意:

val1 | val2 是 val1 和 val2 的按位或。
val1 & val2 是 val1 和 val2 的按位与。

输入:nums = [1,4]
输出:5
解释:
三元组和它们对应的有效值如下:

  • (0,0,0) 有效值为 ((1 | 1) & 1) = 1
  • (0,0,1) 有效值为 ((1 | 1) & 4) = 0
  • (0,1,0) 有效值为 ((1 | 4) & 1) = 1
  • (0,1,1) 有效值为 ((1 | 4) & 4) = 4
  • (1,0,0) 有效值为 ((4 | 1) & 1) = 1
  • (1,0,1) 有效值为 ((4 | 1) & 4) = 4
  • (1,1,0) 有效值为 ((4 | 4) & 1) = 0
  • (1,1,1) 有效值为 ((4 | 4) & 4) = 4
    数组的 xor 美丽值为所有有效值的按位异或 1 ^ 0 ^ 1 ^ 4 ^ 1 ^ 4 ^ 0 ^ 4 = 5 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-xor-beauty-of-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int xorBeauty(vector<int>& nums) {//这题像是一个脑筋急转弯
    //n ^ n = 0而所有三元组中num[i] | nums[j]会出现两次,并且由规则可知,有效值只会出现原数组中的数和0
    /*(0,0,0) 有效值为 ((1 | 1) & 1) = 1
      (0,0,1) 有效值为 ((1 | 1) & 4) = 0  
      (0,1,0) 有效值为 ((1 | 4) & 1) = 1
      在同一个k的情况下,第一行和第三行异或为0,只剩下第二行
      由此最终只剩下0 1 4
      0 ^ n = n*/
        int ans = 0;
        for (int i = 0; i < nums.size(); ++i){
            ans ^= nums[i];
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值