Leetcode——第 329 场周赛

news2024/9/25 21:27:01

题目链接:

交替数字和
根据第 K 场考试的分数排序
执行逐位运算使字符串相等
拆分数组的最小代价

题目描述

交替数字和

给你一个正整数 n n中的每一位数字都会按下述规则分配一个符号:

最高有效位 上的数字分配到 号。
剩余每位上数字的符号都与其相邻数字相反
返回所有数字及其对应符号的和。

示例 1:

输入:n = 521
输出:4
解释:(+5) + (-2) + (+1) = 4

示例 2:

输入:n = 111
输出:1
解释:(+1) + (-1) + (+1) = 1

示例 3:

输入:n = 886996
输出:0
解释:(+8) + (-8) + (+6) + (-9) + (+9) + (-6) = 0

提示:

  • 1 < = n < = 1 0 9 1 <= n <= 10^9 1<=n<=109

分析:根据题意直接模拟即可。

时间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {
public:
    int alternateDigitSum(int n) {
        string s = to_string(n);
        int ans = 0;
        //初始为整数,然后正负交替
        int f = 1;
        for(auto &c:s){
            ans += f * (c - '0');
            f *= -1;
        }
        return ans;
    }
};

根据第 K 场考试的分数排序

班里有 m位学生,共计划组织 n场考试。给你一个下标从 0开始、大小为 m x n的整数矩阵 score,其中每一行对应一位学生,而 score[i][j]表示第 i 位学生在第 j 场考试取得的分数。矩阵 score包含的整数 互不相同

另给你一个整数 k。请你按第 k场考试分数从高到低完成对这些学生(矩阵中的行)的排序。

返回排序后的矩阵。

示例 1:

在这里插入图片描述

输入:score = [[10,6,9,1],[7,5,11,2],[4,8,3,15]], k = 2
输出:[[7,5,11,2],[10,6,9,1],[4,8,3,15]]
解释:在上图中,S 表示学生,E 表示考试。

  • 下标为 1 的学生在第 2 场考试取得的分数为 11 ,这是考试的最高分,所以 TA 需要排在第一。
  • 下标为 0 的学生在第 2 场考试取得的分数为 9 ,这是考试的第二高分,所以 TA 需要排在第二。
  • 下标为 2 的学生在第 2 场考试取得的分数为 3 ,这是考试的最低分,所以 TA 需要排在第三。

示例 2:

在这里插入图片描述

输入:score = [[3,4],[5,6]], k = 0
输出:[[5,6],[3,4]]
解释:在上图中,S 表示学生,E 表示考试。

  • 下标为 1 的学生在第 0 场考试取得的分数为 5 ,这是考试的最高分,所以 TA 需要排在第一。
  • 下标为 0 的学生在第 0 场考试取得的分数为 3 ,这是考试的最低分,所以 TA 需要排在第二。

提示:

  • m = = s c o r e . l e n g t h m == score.length m==score.length
  • n = = s c o r e [ i ] . l e n g t h n == score[i].length n==score[i].length
  • 1 < = m , n < = 250 1 <= m, n <= 250 1<=m,n<=250
  • 1 < = s c o r e [ i ] [ j ] < = 1 0 5 1 <= score[i][j] <= 10^5 1<=score[i][j]<=105
  • score不同 的整数组成
  • 0 < = k < n 0 <= k < n 0<=k<n

分析:按照第 k 列,从大到小重排数组即可。

时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

代码:

class Solution {
public:
    vector<vector<int>> sortTheStudents(vector<vector<int>>& score, int k) {
        sort(score.begin(),score.end(),[&](auto &a,auto &b){
            return a[k] > b[k];
        });

        return score;
    }
};

执行逐位运算使字符串相等

给你两个下标从 0 开始的 二元 字符串 st,两个字符串的长度均为 n。你可以对 s执行下述操作 任意 次:

  • 选择两个 不同 的下标 ij,其中 0 < = i , j < n 0 <= i, j < n 0<=i,j<n
  • 同时,将 s[i] 替换为 (s[i] OR s[j]) ,s[j] 替换为 (s[i] XOR s[j]) 。

例如,如果 s = "0110",你可以选择 i = 0 和 j = 2 i = 0 和 j = 2 i=0j=2,然后同时将 s[0] 替换为 (s[0] OR s[2] = 0 OR 1 = 1),并将 s[2] 替换为 (s[0] XOR s[2] = 0 XOR 1 = 1),最终得到 s = “1110” 。

如果可以使 s等于 t,返回 true ,否则,返回 false 。

示例 1:

输入:s = “1010”, t = “0110”
输出:true 解释:可以执行下述操作:

  • 选择 i = 2 和 j = 0 ,得到 s = “0010”.
  • 选择 i = 2 和 j = 1 ,得到 s = “0110”. 可以使 s 等于 target ,返回 true 。

示例 2:

输入:s = “11”, t = “00”
输出:false
解释:执行任意次操作都无法使 s 等于 target 。

提示:

  • n = = s . l e n g t h = = t a r g e t . l e n g t h n == s.length == target.length n==s.length==target.length
  • 2 < = n < = 1 0 5 2 <= n <= 10^5 2<=n<=105
  • st仅由数字 0 和 1 组成

分析:

要么 st同时都有 1,要么 st全部都是 0。否则 s不能变为 t

时间复杂度 O ( n ) O(n) O(n)

代码:

class Solution {
public:
    bool makeStringsEqual(string s, string t) {
        if(s == t) return true;
        int n = s.size();
        bool a = false,b = false;

        for(int i = 0;i < n;i++){
            if(s[i] == '1') a = true;
            if(t[i] == '1') b = true;
        }
        //要么都有1 要么都没有1 才成立
        return (a && b) || (!a && !b);
    }
};

拆分数组的最小代价

给你一个整数数组 nums和一个整数 k

将数组拆分成一些非空子数组。拆分的 代价 是每个子数组中的 重要性 之和。

trimmed(subarray)作为子数组的一个特征,其中所有仅出现一次的数字将会被移除。

例如, t r i m m e d ( [ 3 , 1 , 2 , 4 , 3 , 4 ] ) = [ 3 , 4 , 3 , 4 ] trimmed([3,1,2,4,3,4]) = [3,4,3,4] trimmed([3,1,2,4,3,4])=[3,4,3,4]
子数组的 重要性 定义为 k + t r i m m e d ( s u b a r r a y ) . l e n g t h k + trimmed(subarray).length k+trimmed(subarray).length

例如,如果一个子数组是 [1,2,3,3,3,4,4] t r i m m e d ( [ 1 , 2 , 3 , 3 , 3 , 4 , 4 ] ) = [ 3 , 3 , 3 , 4 , 4 ] trimmed([1,2,3,3,3,4,4]) = [3,3,3,4,4] trimmed([1,2,3,3,3,4,4])=[3,3,3,4,4] 。这个子数组的重要性就是 k + 5

找出并返回拆分 nums的所有可行方案中的最小代价

子数组 是数组的一个连续 非空 元素序列。

示例 1:

输入:nums = [1,2,1,2,1,3,3], k = 2
输出:8
解释:将 nums 拆分成两个子数组:[1,2],[1,2,1,3,3] [1,2] 的重要性是 2 + (0) = 2 。 [1,2,1,3,3] 的重要性是 2 + (2 + 2) = 6 。 拆分的代价是 2 + 6 = 8 ,可以证明这是所有可行的拆分方案中的最小代价。

示例 2:

输入:nums = [1,2,1,2,1], k = 2
输出:6
解释:将 nums 拆分成两个子数组:[1,2], [1,2,1] 。
[1,2] 的重要性是 2 + (0) = 2 。 [1,2,1] 的重要性是 2 + (2) = 4 。
拆分的代价是 2 + 4 = 6 ,可以证明这是所有可行的拆分方案中的最小代价。

示例 3:

输入:nums = [1,2,1,2,1], k = 5
输出:10
解释:将 nums 拆分成一个子数组:[1,2,1,2,1].
[1,2,1,2,1] 的重要性是 5 + (3 + 2) = 10 。
拆分的代价是 10 ,可以证明这是所有可行的拆分方案中的最小代价。

提示:

  • 1 < = n u m s . l e n g t h < = 1000 1 <= nums.length <= 1000 1<=nums.length<=1000
  • 0 < = n u m s [ i ] < n u m s . l e n g t h 0 <= nums[i] < nums.length 0<=nums[i]<nums.length
  • 1 < = k < = 1 0 9 1 <= k <= 10^9 1<=k<=109

分析:
我们定义 f ( i ) f(i) f(i) 为将前 i 个元素(也就是 0 ~ i - 1下标的元素)拆分的最小代价。所以按照定义,最后的答案为 f ( n ) f(n) f(n)

状态转移: 对于 j = [ 0 , i − 1 ] j = [0,i - 1] j=[0,i1] f ( i ) = m i n ( f [ i ] , f [ j ] + t r i m m e d ( [ j , j + 1 , . . . i − 1 ] ) + k ) f(i) = min(f[i],f[j] + trimmed([j,j+1,...i-1]) + k) f(i)=min(f[i],f[j]+trimmed([j,j+1,...i1])+k)

时间复杂度: O ( n 2 ) O(n^2) O(n2)

代码:

using LL = long long;
class Solution {
public:
    int minCost(vector<int>& nums, int k) {
        int n = nums.size();

        LL f[n+1];
        //将 f[i] 初始化为无穷大
        for(int i = 0;i <= n;i++) f[i] = 1e10;
        f[0] = 0;
        //cnt 记录区间元素出现的次数
        int cnt[n];

        for(int i = 1;i <= n;i++){
            memset(cnt,0,sizeof cnt);
            //x 记录 [j,i-1] 区间的有效元素个数(即起码出现两次的元素)
            int x = 0;

            for(int j = i - 1;j >= 0;j--){
                ++cnt[nums[j]];
                //只记录出现次数大于2次 的元素
                if(cnt[nums[j]] == 2) x += 2;
                else if(cnt[nums[j]] > 2) x++;

                f[i] = min(f[i],f[j] + x + k);
            }
        }    
        return f[n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/175734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习记录666@项目管理之项目质量管理

什么项目质量管理 所谓项目质量&#xff0c;是项目满足需求的程度&#xff1b;所谓质量管理&#xff0c;就是为了使项目满足需求的程度足够高或者是合适程度下而进行的一系列管理活动。 包括规划质量管理、实施质量保证、质量控制三个方面。 规划质量管理 规划质量管理主要…

JUC面试(七)——CountDownLatchCyclicBarrierSemaphore

CountDownLatch 概念 让一些线程阻塞直到另一些线程完成一系列操作才被唤醒 CountDownLatch主要有两个方法&#xff0c;当一个或多个线程调用await方法时&#xff0c;调用线程就会被阻塞。其它线程调用CountDown方法会将计数器减1&#xff08;调用CountDown方法的线程不会被…

nacos源码分析==客户端从服务端读取配置文件-服务端服务注册

客户端从服务端读取配置文件 客户端启动的时候会扫描到boostrap.yml中的信息&#xff0c;扫描到标签ConditionalOnProperty会将NacosConfigBootstrapConfiguration 中的bean注入。其中NacosConfigProperties就是读取的boostrap.yml中spring.cloud.nacos.config下的配置项。Nac…

“深度学习”学习日记。与学习有关的技巧--权重的初始值

2023.1.22 在深度学习的学习中&#xff0c;权重的初始值特别重要。这关系到神经网络的学习能否成功&#xff1b; 在以前误差反向传播法和神经网络学习的算法实现这两篇文章中&#xff0c;对权重的初始值的确定是这样的&#xff1a; class TwoLayerNet:def __init__(self, inp…

在2022年的最后一天我学会了哈希表

文章目录前言STL相关容器unordered_setunordered_map哈希表哈希冲突闭散列开散列STL相关容器的模拟实现用一个哈希表改造两个容器哈希表的迭代器总结前言 首先先提前祝贺大家新年快乐&#xff01;本文是农历2022年的最后一篇博客。而今天我们介绍的也是STL里面重要的一个数据结…

2023年, 前端路上的开源总结(最新更新...)

19年至今, 笔者利用空余时间陆陆续续做了一些开源项目, 大部分开源项目都是以实际价值为开源基础, 所以我觉得有必要做一个总结和复盘,在复盘的过程中希望也能对大家有所帮助.今后笔者的开源项目都会放在这篇文章中,如果想学习的可以收藏交流.1. 基于react实现的滑动验证码组件…

[LeetCode周赛复盘] 第 96 场双周赛20230121

[LeetCode周赛复盘] 第 96 场双周赛20230121 一、本周周赛总结二、 [Easy] 6300. 最小公共值1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6275. 使数组中所有元素相等的最小操作数 II1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6302. 最大子序列的分数1. 题目描述2. 思…

【JavaScript】33_对象的序列化----JSON

3、对象的序列化 对象的序列化 JS中的对象使用时都是存在于计算机的内存中的 序列化指将对象转换为一个可以存储的格式 在JS中对象的序列化通常是一个对象转换为字符串&#xff08;JSON字符串&#xff09;序列化的用途&#xff08;对象转换为字符串有什么用&#xff09;&…

Linux嵌入式开发——文件系统结构

文章目录Linux嵌入式开发——文件系统结构一、根目录“/”二、Ubuntu文件系统结构三、绝对路径和相对路径Linux嵌入式开发——文件系统结构 一、根目录“/” ​ Linux下“/”就是根目录&#xff01;所有的目录都是由根目录衍生出来的。 二、Ubuntu文件系统结构 /bin 存放二进…

第十届蓝桥杯省赛 C++ A/B组 - 完全二叉树的权值

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;蜂巢 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥杯的小伙伴整理常考算法题解&#xff0c;祝大家都能…

Linux C编程一站式学习笔记4

Linux C编程一站式学习笔记 chap4 分支语句 文章目录Linux C编程一站式学习笔记 chap4 分支语句一.if语句语句块习题二.if/else语句引例if/else语句 语法规则if else 的配对原则习题1、写两个表达式&#xff0c;分别取整型变量x的个位和十位2、写一个函数&#xff0c;参数是整型…

常见流对象的使用

文章目录一、缓冲流字节缓冲流字符缓冲流二、转换流字符输入转换流字符输出转换流三、对象序列化对象序列化对象反序列化四、打印流PrintStreamPrintWriter一、缓冲流 缓冲流&#xff1a;也叫高效流或者高级流&#xff0c;我们之前学的字节流称为原始流&#xff0c;缓冲流自带…

【JavaSE】浅析String与StringTable

文章目录1. 前言2. String的两种创建方式2.1 通过new关键字创建一个字符串对象2.2 采用双引号的方式来创建字符串对象2.3 两种方式的区别3. StringTable的位置4. String的intern()方法5. 判断两个字符串是否相等5.1 equals5.2 1. 前言 String类是开发中经常使用的一个类。 对…

第七层:多态

文章目录前情回顾多态多态的基本概念动态多态的满足条件动态多态的使用虚函数多态的优点纯虚函数和抽象类抽象类特点虚析构和纯虚析构虚析构和纯虚析构的共性虚析构和纯虚析构的区别面向对象结束&#xff0c;接下来是什么?本章知识点&#xff08;图片形式&#xff09;&#x1…

数据结构进阶 哈希桶

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;模拟实现高阶数据结构 哈希桶 哈希桶哈希冲突的另一种解决方法开散列 -- 链地址法举例哈希表的开散列实现 --哈希桶哈希表的结构…

自动化测试Selenium【基础篇二】

自动化测试Selenium【基础篇二】&#x1f34e;一.Selenium基础使用&#x1f352;1.1 信息打印&#x1f349; 1.1.1打印标题&#x1f349; 1.1.1打印当前网页标题&#x1f352;1.2 窗口&#x1f349;1.2.1 获取句柄&#x1f349;1.2.2 窗口切换&#x1f349;1.2.3 窗口大小设置&…

当你点击浏览器的瞬间都发生了什么----- 网络学习笔记

计算机网络前言web 浏览器协议栈创建套接字阶段。连接阶段。断开阶段。IP模块网卡网络设备 --- 集线器、交换器和路由器集线器交换器路由器路由器的附加功能一 &#xff1a;地址转换路由器的附加功能一 &#xff1a;包过滤功能互联网内部接入网光纤接入网&#xff08;FTTH&…

JDK8 前后的 Date 日期时间 API

JDK8 前后的 Date 日期时间 API 每博一文案 师父说&#xff1a;人只要活在世界上&#xff0c;就会有很多的烦恼&#xff0c;痛苦或是快乐&#xff0c;取决于逆的内心&#xff0c;只要心里拥有温暖灿烂的阳光&#xff0c; 那么悲伤又有什么好畏惧的呢&#xff1f; 人生如行路&a…

vue学习笔记(更新中)

目录 简介 使用Vue写一个"hello&#xff0c;world" 前置准备 代码书写 MVVM模型理解 插值语法和指令语法 插值语法 指令语法 指令&#xff1a;v-bind 指令&#xff1a;v-model vue中的el和data的两种写法 数据代理 方法&#xff1a;defineProperty() 说明…

新年礼物已收到!2022 Apache IoTDB Commits 数量排名 3/364!

社区喜报&#xff01;据 The Apache Software Foundation 官方 Projects Statistics&#xff08;项目信息统计网站&#xff09;的实时数据显示&#xff0c;Apache IoTDB 在过去 12 个月&#xff08;即 2022 年度&#xff09;共发表 6829 Commits&#xff0c;排名 2022 年度 Apa…