LeetCode第 20 场双周赛

2024-02-20 22:18
文章标签 leetcode 20 双周

本文主要是介绍LeetCode第 20 场双周赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.根据数字二进制下 1 的数目排序

/*** Note: The returned array must be malloced, assume caller calls free().*/int cal(int num){int sum=0;while(num){sum+=num%2;num/=2;}return sum;}
int* sortByBits(int* arr, int arrSize, int* returnSize){int  i,tmp,j;int *onenum=(int*)malloc(sizeof(int)*(arrSize+1));for(i=0;i<arrSize;i++){onenum[i]=cal(arr[i]);}for(i=0;i<arrSize-1;i++){for(j=i+1;j<arrSize;j++){if(onenum[i]>onenum[j]||(onenum[i]==onenum[j]&&arr[i]>arr[j])){tmp=onenum[i];onenum[i]=onenum[j];onenum[j]=tmp;tmp=arr[i];arr[i]=arr[j];arr[j]=tmp;}}}*returnSize=arrSize;return arr;
}

2.每隔 n 个顾客打折

typedef struct {int n;int now;int discount;int* products;int productsSize;int* prices;int pricesSize;
} Cashier;Cashier* cashierCreate(int n, int discount, int* products, int productsSize, int* prices, int pricesSize) {Cashier* t=(Cashier*)malloc(sizeof(Cashier));t->n=n;t->now=0;t->discount=discount;t->products=products;t->productsSize=productsSize;t->prices=prices;t->pricesSize=pricesSize;return t;
}double cashierGetBill(Cashier* obj, int* product, int productSize, int* amount, int amountSize) {obj->now++;double sum=0;for(int i=0;i<productSize;i++){for(int j=0;j<obj->productsSize;j++){if(obj->products[j]==product[i]){sum=sum+obj->prices[j]*amount[i];break;}}}if(obj->now==obj->n){sum=sum-(obj->discount*sum)/100;obj->now=0;}return sum;
}void cashierFree(Cashier* obj) {
free(obj);
}/*** Your Cashier struct will be instantiated and called as such:* Cashier* obj = cashierCreate(n, discount, products, productsSize, prices, pricesSize);* double param_1 = cashierGetBill(obj, product, productSize, amount, amountSize);* cashierFree(obj);
*/

3.包含所有三种字符的子字符串数目

【思路】考虑子串是否包含abc,且重复的子串也算。我们每次从i开始遍历,计算i开始的字符串中有多少个符合要求的子串。如果采用双循环,会超时。在这里需要优化一下,其实遍历i开始的字符串我们只需要保存上一次遍历的末尾 j,而j前面遍历的结果已经存在数组d中。

我们用一个数组d[3]来存放出现的abc的次数。如果d[0],d[1],d[2]都不为0,表示当前子串已经出现了abc字母,那么接下来j后面的字符无需遍历,因为再加入任何一个字符,都可以组成符合要求的字符串。

int numberOfSubstrings(char * s){int i,j=0,len,sum=0,tmp;int d[3]={0};len=strlen(s);if(len<3)return 0;for(i=0;i<len;i++){while(j<len&&(d[0]==0||d[1]==0||d[2]==0)){d[s[j]-'a']++;j++;}if(!(d[0]==0||d[1]==0||d[2]==0)){sum+=len-j+1;}d[s[i]-'a']--;}return sum;
}

4.有效的快递序列数目

【思路】用dp[i][j]表示当前收件为i件,发件为j件。当前的操作分为收件和发件。

对于收件:dp[i][j]+=dp[i-1][j]*(n-(i-1));其中,收件可以是剩下包裹n-(i-1)中的任意一件

对于发件:dp[i][j]+=dp[i][j-1]*(i-(j-1));其中,发件可以是当前收件i除去已发的j-1,剩余i-(j-1)中任意一件

int countOrders(int n){long long i,j,dp[n+1][n+1];memset(dp,0,sizeof(dp));long long mod=1000000007;dp[0][0]=1;//已发0件,已收0件,方案为1for(i=1;i<=n;i++){for(j=0;j<=i;j++){
//如果当前是收件,那么收件可以是剩下包裹n-(i-1)中的任意一件dp[i][j]+=dp[i-1][j]*(n-(i-1));dp[i][j]%=mod;
//如果当前是发件,那么发件可以是当前收件i除去已发的j-1,剩余i-(j-1)中任意一件if(j>0)dp[i][j]+=dp[i][j-1]*(i-(j-1));dp[i][j]%=mod;}}return (int)dp[n][n];
}

 

这篇关于LeetCode第 20 场双周赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/729701

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划