LeetCodeWeeklyContest-160

2024-01-01 06:59
文章标签 160 leetcodeweeklycontest

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

题目传送门

找出给定方程的正整数解

签到题的新包装,我没有玩过的船新版本。

class Solution {
public:vector<vector<int>> findSolution(CustomFunction& c, int z) {vector<vector<int>> res;for(int i=1;i<=1000;i++){for(int j=1;j<=1000;j++){if(c.f(i,j)<z) continue;else if(c.f(i,j)==z) {vector<int> v;v.push_back(i),v.push_back(j);res.push_back(v);}else break;}}return res;}
};

循环码排列

给你两个整数 n 和 start。你的任务是返回任意 (0,1,2,…,2^n-1) 的排列 p,并且满足:

  • p[0] = start
  • p[i] 和 p[i+1] 的二进制表示形式只有一位不同
  • p[0] 和 p[2^n -1] 的二进制表示形式也只有一位不同

举个例子:

  • 输入:n = 2, start = 3
  • 输出:[3,2,0,1]
  • 解释:这个排列的二进制表示是 (11,10,00,01)
  • 所有的相邻元素都有一位是不同的,另一个有效的排列是 [3,1,0,2]

思路

参考:

  • [Java/C++/Python] 4-line Gray Code
  • Gray code

其实就是格雷码。
使用位运算操作

实现

vector<int> circularPermutation(int n, int start) {vector<int> res; for(int i=0;i< 1<<n;i++){res.push_back(start^i^i>>1);}return res;}

比赛时找了个格雷码的板子,然后改了改,就过掉了…

class Solution {
public:vector<int> grayCode(int n){vector<int> gray;if (n < 1) {gray.push_back(0);return gray;}int num = pow(2,n);int graycode[n];for (int i = 0; i < num; i++) {IntToBit(graycode, i, n);BitToGray(graycode,n);gray.push_back(GrayBitToInt(graycode, n));}return gray;}void IntToBit(int *code, int n, int bit){int i = bit-1;while (i >= 0) {code[i--] = n%2;n/=2;}}void BitToGray(int *code, int bit){int temp[bit];temp[0] = 0^code[0];for (int i = 0; i < bit-1; i++) {temp[i+1] = code[i]^code[i+1];}for (int i = 0; i < bit; i++) {code[i] = temp[i];}}int GrayBitToInt(int *code, int bit){int number = 0;for (int i = 0; i < bit; i++) {if (code[i] == 1) {number += pow(2, bit-i-1);}}return number;}vector<int> circularPermutation(int n, int start) {vector<int> res,tmp;tmp = grayCode(n);int index,msize = pow(2,n);for(int i=0;i<msize;i++){if(tmp[i]==start){index = i;break;}}for(int i=index;i<msize;i++){res.push_back(tmp[i]);}for(int i=0;i<index;i++){res.push_back(tmp[i]);}return res;}
};

串联字符串的最大长度

给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串,如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。
请返回所有可行解 s 中最长长度。

思路

判定函数+DFS
判定函数:判定一个字符串是否有重复字母,打个大小为26的表即可。

实现

class Solution {
public:int maxL = 0;bool pend(string s1){int ph[26]={0};for(int i=0;i<s1.length();i++){if(ph[s1[i]-'a']==1) return false;ph[s1[i]-'a']=1;}return true;}void dfs(vector<string> arr, int index, string str){int len = str.length();if(pend(str)) maxL = max(maxL,len);if(index == arr.size()||!pend(str)) return ;for(int i=index;i<arr.size();i++){dfs(arr,i+1,str+arr[i]);}}int maxLength(vector<string>& arr) {dfs(arr,0,"");return maxL;}
};

铺瓷砖

你是一位施工队的工长,根据设计师的要求准备为一套设计风格独特的房子进行室内装修。
房子的客厅大小为 n x m,为保持极简的风格,需要使用尽可能少的 正方形 瓷砖来铺盖地面。
假设正方形瓷砖的规格不限,边长都是整数。
请你帮设计师计算一下,最少需要用到多少块方形瓷砖?

思路

参考:

  • Paper Cut into Minimum Number of Squares | Set 2
  • B站视频讲解

基本上还是DFS,其实这个题很像经典的贪心题目,不过那个貌似是是个正方形,而且这个题有个特殊的点,就是当n==11&&m==13||n==13&&m==11 这个时候的结果应该为6。剩下的就是先横切,看需要多少方形瓷砖,然后再纵切,看需要多少方形瓷砖,取横切和纵切的最小值,便是结果。

实现

class Solution {
public:int dp[300][300]={0}; int solve(int n,int m){if(n==m)return 1;if(dp[n][m])return dp[n][m];int res = 2e8;for(int i=1;i<=n/2;i++){res = min(solve(i,m)+solve(n-i,m),res);}for(int j=1;j<=m/2;j++){res = min(solve(n,j)+solve(n,m-j),res);}dp[n][m] = res;return res;}int tilingRectangle(int n, int m) {if(n==11&&m==13||n==13&&m==11) return 6;return solve(n,m);}};

你一人低头在路上… 多向往 多漫长

这篇关于LeetCodeWeeklyContest-160的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

新160个crackme - 051-Keygenning4newbies

运行分析 需要破解Name和Serial PE分析 C++程序,32位,无壳 静态分析&动态调试 ida找到关键字符串,双击进入函数 静态分析得到以下结论:1、Name长度要大于4,小于502、v5 += Name[i] ^ (i + 1)3、v7 = 最后一个Name[i] ^ (i + 1)4、Serial = (v5<<7) + 6* v7 的16进制

新160个crackme - 050-daxxor

运行分析 需要破解Name和Serial PE分析 C++程序,32位,无壳 静态分析&动态调试 ida找到关键字符串,双击进入函数 通过静态分析发现:1、Name通过计算得到Name12、对Name1第3、5、6分别插入byte_401290、byte_401290、word_401292,得到Name23、双击byte_401290,发现值为0x2D;双

【MATLAB源码-第160期】基于matlab的胡桃夹子优化算法(NOA)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境: MATLAB 2022a 1、算法描述 胡桃夹子优化算法(Nutcracker Optimization Algorithm, NOA)是一个灵感来源于胡桃夹子的故事的元启发式优化算法。这个故事中,胡桃夹子是一个能够将坚果壳轻易地破开以获取内部果仁的工具。在优化算法的语境下,这个过程被比喻为寻找问题解决方案的过程,即如何有效地“破开”问题的“坚硬外壳”以到达其核心或最优解。 灵

新160个crackme - 045-CyTom-crackme

运行分析 需要破解Name和Serial PE分析 Delphi程序,32位,无壳 静态分析&动态调试 ida找到关键字符串,双击进入 动调主函数,函数sub_4251A0作用未知 函数sub_4251A0作用:Name每个字符ascii相乘 算法分析 Name = 'concealbear'a1 = 1for i in range(le

新160个crackme - 043-riijj_cm_20041121

运行分析 除了主程序还有一个dll文件,应该是要加载pf1.dll这个动态链接库运行主程序,需破解Name和Serial,点击注册无反应 PE分析 C++程序,32位,无壳 静态分析&动态调试 尝试ida动调加载动态链接库pf1.dll,弹出错误,推测存在反反调试 使用OD的StrongOD插件绕过反反调试,设置参数如上 程序拖入OD,点击F9,

新160个crackme - 042-crackme

运行分析 提示需要key.dat文件 同目录下创建一个key.dat,提示key.dat内容不对 PE分析 C++程序,32位,无壳 静态分析&动态调试 ida搜索字符串,找到关键字符串双击进入关键函数 对关键函数进行分析,注释如上当满足67行公式时,将会执行下面函数发现89行有个VirtualProtect,即SMCSMC(Self-Modifying

Leetcode 160. 相交链表-----python

160. 相交链表 题目描述: 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 解题思路: python代码实现: class Solution(object):def getIntersectionNode(self, headA, headB):""":type head1, head1: ListNode:rtype: ListNode"""if he

新160个crackme - 041-genocide1

运行分析 提示未找到Reg.dat文件 同目录下创建Reg.dat即可打开程序点击About -> Register,打开注册窗口,但是无法点击OK键 PE分析 upx壳,32位 upx -d crackme.2.exe脱壳 发现是Delphi程序 静态分析&动态调试 DeDeDark打开程序进行分析,发现了注册窗体OK按钮:Butto

【手撕OJ题】——160. 相交链表

目录 🕒 题目⌛ 方法① - 遍历记录链表长度⌛ 方法② - 双指针 🕒 题目 🔎 160. 相交链表【难度:简单🟢】 🔎 面试题 02.07. 链表相交 🔎 剑指 Offer 52. 两个链表的第一个公共节点 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表

Python | Leetcode Python题解之第160题相交链表

题目: 题解: class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:A, B = headA, headBwhile A != B:A = A.next if A else headBB = B.next if B else headAreturn A