Leetcode做题记录----3

1474、删除链表M个节点之后的N个节点

思路:

1、两个循环解决问题 第一个循环移动M个位置,第二个循环确定移动N个位置后的,然后将M位置的节点的next指向,N位置后的节点即可

2、注意边界条件和判空处理

代码实现:

    public class Solution{public ListNode DeleteNodes(ListNode head, int m, int n){//定义一个虚拟头结点 也叫哑节点//后面我们直接用这个dummy就不会担心找不到头结点了ListNode dummy = new ListNode();dummy.next = head;ListNode curr = dummy;while (curr != null){if(curr==null)break;//往后移动M个位置for (int i = 0; i < m &&curr!=null; i++){curr = curr.next;}//此时的current就是M节点//记录下他的下一个即nextListNode delStartNode = curr.next;//这里是用来寻找到移动N个节点后的//注意不能用Current这个后面还会利用的 不要破坏for (int i = 0; i < n &&delStartNode!=null; i++){delStartNode = delStartNode.next;}//赋过来就是删除了curr.next = delStartNode;}//最后返回头结点return dummy.next;}}

2011、执行操作后的变量值 

思路:

遍历字符串数组,比较每一个字符串的含义,然后利用条件分支语句执行即可

代码

    public class Solution{public int FinalValueAfterOperations(string[] operations){int res = 0;for (int i = 0; i < operations.Length; i++){switch (operations[i]){case "X++":case "++X":res += 1;break;case "X--":case "--X":res -= 1;break;default:break;}}return res;}}

202、快乐数

思路:

1、想办法获取到每个位置上的数字,怎么获取呢,首先我们是从右边开始获取数字的,所以用%10获取最后一位数字,然后使用/10就将整体减少了最后一位数字,就可以得到每个位置上的数字了

2、看到循环和一个固定的结果,我们就要想到,利用快慢指针进行算法的实现,当快指针和慢指针汇合时或者快指针为1,则说明题目已经完成了。

2160、拆分数位后四位数字的最小和 

思路:这道题很简单,将获得的整数,通过/10和%10获得每一位,然后通过排序就行了 

public class Solution {public int MinimumSum(int num) {string s = num.ToString();char[] chars = s.ToCharArray();//对于字符数组进行排序Array.Sort(chars);//强转为整型int n1 = int.Parse (chars[0].ToString());int n2 = int.Parse (chars[1].ToString());int n3 = int.Parse (chars[2].ToString());int n4 = int.Parse(chars[3].ToString());//计算得出结果return (n1 + n2)*10 + (n3+n4);}
}

2520、统计能整除数字的位数 

 

思路:这个也很简单,通过不断的%10找尾数,然后再让自身去除,看能否整除,能的话,计数器就加一,不能就直接进入下一轮。要注意一下输入的输入的情况,可能他输入个0整你

代码实现: 

public static int CountDigits(int num)
{if(num ==0)return 0;//计数器int counter = 0;while (num > 0){int last = num % 10;if (last == 0) continue;if (num % last == 0){counter++;}num /= 10;}return counter;
}

496、下一个更大元素

思路:

先对nums2进行预处理, 构建一个严格单调递减栈,然后将 每个“对”存到一个字典中,处理完之后,如果栈中还有剩余元素,就按照题目要求,配置他的另一半为-1.然后在遍历nums1,寻找字典中的键,然后返回结果。

代码:

    public class Solution{public int[] NextGreaterElement(int[] nums1, int[] nums2){//构建单调栈Stack<int> stack = new Stack<int>();//创建字典 用于存当前元素后面的第一个比自己的元素Dictionary<int ,int> nextGreater = new Dictionary<int ,int>();//遍历nums2预处理foreach (var num in nums2){//只要栈不为空,当前栈顶的元素小于下一个元素就直接加入字典//那么就是(当前元素,当前元素的下一个更大值)while (stack.Count != 0 && stack.Peek() < num){nextGreater[stack.Pop()] = num;}//反之压入stack.Push(num);}while (stack.Count != 0){//处理栈中剩余的元素nextGreater[stack.Pop()] = -1;}//结果数组int[] res = new int[nums1.Length];for (int i = 0; i < nums1.Length; i++){res[i] = nextGreater[nums1[i]];}return res;}}

633、平方数之和

思路:双指针思路,一个指针指向0,一个指针指向sqrt(c)。然后二者的平方和如果小于c那么a++,反之b--

代码: 

    public class Solution{public bool JudgeSquareSum(int c){int a = 0;int b =(int)Math.Sqrt(c);while (a <= b){int sum = a * a + b * b;if (sum == c)return true;else if (sum < c){a++;}else if (sum > c){b--;}}return false;//for (int a = 0; a < Math.Sqrt(c); a++)//{//    for (int b = (int)Math.Sqrt(c); b > a; b++)//    {//        if(b*b + a*a == c*c)//            return true;//    }//}//return false;}}

注释的部分是会超时算法

520、检测大写字母

思路:

分析题目,无非三种正常情况。

首字母大写后面小写,全部大写,全部小写。那么是不是可以这样想,只有首字母小写加第二个字母大写是不合理的,但是只要后续字母和第一个字母是状态相同的话,是不是就是一个正确的单词组合。

代码:

    public class Solution{public bool DetectCapitalUse(string word){//return (word == word.ToUpper())|| (word == word.ToLower())//    || (char.IsUpper(word[0]) && (word.Substring(1).ToLower() == word.Substring(1)));if (word.Length >= 2 && (word[0] == char.ToLower(word[0])) && (word[1] == char.ToUpper(word[1]))){return false;}for (int i = 2; i < word.Length; i++){if (char.IsLower(word[i]) ^ char.IsLower(word[1])){return false;}}return true;}}

二分查找

思路:

典型的二分查找,设置两个指针,一个指向最左边,一个指向最右边,然后从中间开始查找,注意这里会有左闭右闭,和左闭右开的两种写法。
左闭右闭:说明左右都可以取到,那么循环条件就是左边<=右边,然后里面就是正常的,目标值大于中间值,就左边界移动为mid+,反之右边界为mid-1.

左闭右开:那么说明取不到右边,则循环条件为左边界<右边界,里面就是左边等于mid+1,右边界变化就是直接为mid即可

本道题的代码实现:

    public class Solution{public int Search(int[] nums, int target){int left = 0;int right = nums.Length - 1;while (left <= right){int mid  = left + (right - left) / 2;if (nums[mid] < target){left = mid + 1;}else if (nums[mid] > target) {right = mid - 1;}else return nums[mid];}return -1;}}

另外两种写法

//左闭右闭
public class Solution
{public int Search(int[] nums, int target){int left = 0;int right = nums.Length - 1;while (left <= right){int mid = (right - left) / 2 + left;if (nums[mid] == target){return mid;}else if (nums[mid] < target){left = mid + 1;}else if (nums[mid] > target){right = mid - 1;}}return -1;}
}//左闭右开
public class Solution
{public int Search(int[] nums, int target){int left = 0;int right = nums.Length;while (left < right){int mid = (right - left) / 2 + left;if (nums[mid] == target){return mid;}else if (nums[mid] < target){left = mid + 1;}else if (nums[mid] > target){right = mid;}}return -1;}
}

和二分查找类似的相关题目:

34、在排序数组中查找元素的第一个和最后一个位置

思路:先找到左边界,然后重新设置右边界。同样是利用二分查找的方式寻找左边界。经过二分查找后,那么最左边的下标一定就是目标值所在的位置,如果这个位置的元素和目标元素不一样的话,那么就不存在这个目标元素。

代码实现:

    public class Solution{public int[] SearchRange(int[] nums, int target){int left = 0;int right = nums.Length - 1;//定义结果数组int[] result = new int[] { -1, -1 };//如果为空直接返回if(nums.Length==0) return result;//为什么是<呢,因为这是一个区间就算为一也不能左右相等,因为不是同一个while (left < right){//防止溢出int mid = left + (right - left) / 2;//设置左边界if (nums[mid] < target) left = mid + 1;//设置右边界else right = mid;}if (nums[left]!=target) return result;result[0] = left;//重置 开始找右边界right = nums.Length - 1;while (left < right){int mid = left + (right - left +1) / 2;if(nums[mid] > target) right = mid - 1;else left = mid;}//装结果result[1] = right;return result;}}

34、在排序数组中查找元素的第一个和最后一个位置

    public class Solution{public int[] SearchRange(int[] nums, int target){int left = 0;int right = nums.Length - 1;//定义结果数组int[] result = new int[] { -1, -1 };//如果为空直接返回if(nums.Length==0) return result;//为什么是<呢,因为这是一个区间就算为一也不能左右相等,因为不是同一个while (left < right){//防止溢出int mid = left + (right - left) / 2;//设置左边界if (nums[mid] < target) left = mid + 1;//设置右边界else right = mid;}if (nums[left]!=target) return result;result[0] = left;//重置 开始找右边界right = nums.Length - 1;while (left < right){int mid = left + (right - left +1) / 2;if(nums[mid] > target) right = mid - 1;else left = mid;}//装结果result[1] = right;return result;}}

35、搜索插入位置

思路:继续二分查找即可,这个是左闭右闭的区间。

public class Solution {public int SearchInsert(int[] nums, int target) {int left = 0;int right = nums.Length - 1;while (left <= right){int mid = left + (right - left)/2;if (nums[mid] < target){left = mid + 1;}else if (nums[mid] > target){right = mid - 1;}else return mid;}return left;}
}

69、x的平方根

思路:同理继续二分查找就行,只不过注意的是最后的结果是mid.

代码实现:

    public class Solution{public int MySqrt(int x){int left = 1;int right = x;while (left <= right){int mid = left + (right - left) / 2;if (mid > x / mid) right = mid - 1;else left = mid + 1;}return left - 1;}}

367、有效的完全平方数

思路:这道题得单独的将0和1拿出来考虑,这样会比较的方便处理。然后就是可能会数据溢出,所以得拿个大的容器去装我们的mid*mid,然后如果大于num的话,就需要进行左移,那么就是改变有边界。小于的话,就需要右移,那么就改左边界。

代码实现:

    public class Solution{public bool IsPerfectSquare(int num){long left = 1;long right = num;if(num == 0||num==1) return true;while (left <= right){long mid = (left + right) / 2;long square = mid * mid;if(square==num) return true;else if(square<num) left = mid +1;else right = mid - 1;}return false;}}

双指针

26删除有序数组中的重复项

思路:定义一个指针用来进行维护答案的数组,然后另外一个指针负责移动,然后在移动的时候,注意题目条件的处理,即可得解。

    public class Solution{public int RemoveDuplicates(int[] nums){//判空if(nums.Length==0) return 0;//维护的数组下标int netIndex = 0;for (int i = 1; i < nums.Length; i++){//如果当前元素还没有出现过 就加进来//如果当前元素已经出现过,那么 一个指针一直往后移动//直到遇到下一个没有出现过的元素//然后将这个新元素 赋值到维护数组的下一个位置if (nums[i] != nums[netIndex]){netIndex++;nums[netIndex] = nums[i];}}//你维护的是数组的下标//返回的是长度return netIndex + 1;}}

27、移除元素

思路和上题目一样:

代码实现:

public class Solution {public int RemoveElement(int[] nums, int val) {int slow = 0;for (int i = 0; i < nums.Length; i++){if (nums[i] != val){nums[slow++] = nums[i];}}return slow;}
}

283、移动零

思路:先把不为零的数字往前移动,一个贴一个,最后补0即可

代码实现:

    public class Solution{public void MoveZeroes(int[] nums){int nextNonZero = 0;//移位for (int i = 0; i < nums.Length; i++){if (nums[i] != 0){//注意是先移动了已经存好的数组的下标//因为下一个元素为0nextNonZero++;nums[nextNonZero] = nums[i];}}//补零for (int i = nextNonZero; i < nums.Length; i++){nums[i] = 0;}}}

977、有序数组的平方

思路:

①全部平方完以后,排序得解。

②利用双指针,因为这个数组本就是一个有序数组,那么平方一定是两侧的最大,你可以反复比较左右的元素的平方,然后你再加到你的结果数组中去就行

代码实现:

public class Solution {public int[] SortedSquares(int[] nums) {int[] result = new int[nums.Length];int k =nums.Length-1;for (int i = 0, j = nums.Length - 1; i <= j;){if (nums[i] * nums[i] > nums[j] * nums[j]){result[k] = nums[i] *nums[i];i++;k--;}else{result[k] = nums[j] *nums[j];j--;k--;}}return result;}
}

844、比较含空格的字符串

思路:注意其中一个指针的移动位置就好。

代码实现:

    public class Solution{public bool BackspaceCompare(string s, string t){int kongge_1 = 0;int kongge_2 = 0;char[] schars = s.ToCharArray();char[] tchars = t.ToCharArray();foreach (char c in schars){if (c != '#'){schars[kongge_1] = c;kongge_1++;}else{if(kongge_1 > 0)kongge_1--;}}foreach(char c in tchars){if (c != '#'){tchars[kongge_2] = c;kongge_2++;}else{if (kongge_2 > 0)kongge_2--;}}if(kongge_1-kongge_2!=0)return false;for (int i = 0; i < kongge_2; i++){if (schars[i] != tchars[i]) return false;}return true;}}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pytorch快速入门——手写数字分类GPU加速

&#x1f451;主页&#xff1a;吾名招财 &#x1f453;简介&#xff1a;工科学硕&#xff0c;研究方向机器视觉&#xff0c;爱好较广泛… ​&#x1f4ab;签名&#xff1a;面朝大海&#xff0c;春暖花开&#xff01; pytorch快速入门——手写数字分类GPU加速 一、tensor1&#…

阿里wan2.1本地部署

1.安装虚拟环境&#xff0c; a) 安装python-3.11.8 b)在本地目录运行 - python -m venv Wan2.1-env - cd Scripts - activate 2.下载代码 git clone https://github.com/Wan-Video/Wan2.1.git cd Wan2.1 3.安装依赖库 pip install torch torchvision --index-url https://…

HTTPS建立连接过程

一、混合加密 通过混合加密的方式可以保证信息的机密性&#xff0c;解决了窃听的风险。 HTTPS采用的是对称加密和非对称加密结合的混合加密方式&#xff1a; &#xff08;1&#xff09; 在通信建立前采用非对称加密的方式交换会话密钥&#xff0c;后续就不再使用非对称加密。 &…

Leetcode-2272. Substring With Largest Variance [C++][Java]

目录 一、题目描述 二、解题思路 【C】 【Java】 Leetcode-2272. Substring With Largest Variancehttps://leetcode.com/problems/substring-with-largest-variance/description/2272. 最大波动的子字符串 - 力扣&#xff08;LeetCode&#xff09;2272. 最大波动的子字符串…

蓝桥杯备赛 Day0_移动零

&#x1f388; 个人主页&#x1f449;&#xff1a;tbRNA-CSDN博客tbRNA-CSDN博客tbRNA-CSDN博客 &#x1f4af; 个人简介&#xff1a;在校大学生一枚&#x1f48b;. &#x1f60d; 希望我的文章对大家有着不一样的帮助&#xff0c;欢迎大家关注我&#xff0c;感谢大家的多多支持…

EDAS:投稿经验-word版本-问题解决

1. 字体不对&#xff0c;字体未嵌入问题 问题&#xff1a;word转PDF后&#xff0c;总是显示有字体格式不对&#xff08;忘记截图了&#xff09;。 办法&#xff1a;1. EDAS投稿PDF格式问题-CSDN博客-PDF上修改 IEEE论文检测的字体未嵌入问题Times New Ro…

TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)

TCP/IP协议中三次握手&#xff08;Three-way Handshake&#xff09;与四次挥手&#xff08;Four-way Wave&#xff09; 一、TCP三次握手&#xff08;Three-way Handshake&#xff09;二、TCP四次挥手&#xff08;Four-way Wave&#xff09;三、常见问题解答总结为什么三次握手不…

代码随想录Day16

Day16 二叉树part06 LeetCode 530.二叉搜索树的最小绝对差 题目描述 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 输入&#xff1a;root [4,2,6,1,3] 输出&…

用通义大模型写爬虫程序,汇总各科成绩

需求&#xff1a;根据各科网址&#xff0c;输入学号、姓名查询成绩。 中间反反复复很多次&#xff0c;本文只记下重点的几次和大模型的沟通历史。 输入界面 查询界面 round0&#xff08;最初的问题&#xff09; 请在windows下&#xff0c;使用python的selenium库&#xff0…

Java算法OJ(12)

目录 1.前言 2.正文 2.1Fib数列 2.2单词搜索 2.3杨辉三角 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道的练习题&#xff0c;欢迎大家在评论区多多交流&#xff0c;废话不多说让我们直接开始吧。 2.正文 2.1Fib数列 题目&#xff1a;斐波那契数列_牛客题霸…

使用傅里叶变换测量声卡的频率失真

文章目录 一、说明二、关于声卡的技术详述三、实验代码获取四、结论 一、说明 假如我希望使用我的声卡来模拟软件无线电&#xff0c;利用声音而不是射频信号。我的声卡能胜任这项任务吗&#xff1f;本文将研究一种技术来找出答案。另外&#xff0c;需要了解音频技术的读者也可…

LeetCode 解题思路 18(Hot 100)

解题思路&#xff1a; 继承 LinkedHashMap&#xff1a; 内置双向链表&#xff0c;自动维护节点的插入顺序和访问顺序。LRU 淘汰逻辑&#xff1a; 覆盖 removeEldestEntry&#xff0c;当元素数量超过 capacity 时&#xff0c;移除最旧条目。removeEldestEntry 方法提供钩子&…

JS基础部分

引入方式 内部脚本 外部脚本 变量 使用let声明变量&#xff0c;弱类型&#xff0c;使用const声明常量 因为箭头函数中this指针有问题&#xff0c;会默认指向父级对象 DOM 文档对象模型&#xff0c;将标记语言的各个部分封装成对应的对象。js通过dom就能够对html进行操作 …

Linux与深入HTTP序列化和反序列化

深入HTTP序列化和反序列化 本篇介绍 在上一节已经完成了客户端和服务端基本的HTTP通信&#xff0c;但是前面的传递并没有完全体现出HTTP的序列化和反序列化&#xff0c;为了更好得理解其工作流程&#xff0c;在本节会以更加具体的方式分析到HTTP序列化和反序列化 本节会在介绍…

QT入门笔记2

目录 一、前言 二、串口助手实现 2.1、串口 2.1.1、可用串口信息-QSerialPortInfo 2.1.2、打开串口-QSerialPort 2.1.3、串口发送接收信息 2.2、定时器-QTimer 2.3、常用属性类型转换&#xff08;会更新&#xff09; 2.4、子控件组规则命名优化 一、前言 这个是学习Q…

DeepSeek(3):DeepSeek R1 提示词⼯程

1 提示词⼯程 5W1H&#xff08;What, Who, When, Where, Why, How&#xff09;是⼀种常⽤的信息收集和指令下达的⽅法。以下是根据这个⽅法为DeepSeek R1模型下指令的例⼦&#xff0c;以“学习⼤模型应⽤开发”为例&#xff1a; &#xff08;1&#xff09;What&#xff08;是什…

Linux入门 全面整理终端 Bash、Vim 基础命令速记

Linux入门 2025 超详细全面整理 Bash、Vim 基础命令速记 刚面对高级感满满的 终端窗口是不是有点懵&#xff1f;于是乎&#xff0c;这份手册就是为你准备的高效学习指南&#xff01;我把那些让人头大的系统设置、记不住的命令都整理成了对你更友好的格式&#xff0c;让你快速学…

RBA+minibatch的尝试

目录 还是咬着牙来写 RBA了 JAX JAX->TORCH torch tensor的变形 pytorch怎么把一个【3,3,5】的tensor变成【3,10,5】&#xff0c;多的用0填充 pytorch如何把shape【100】转成【100,1】 把torch shape【100,1】变成【100】 SQUEEZE grad_fn 不能两次反向传播 还…

Jupyter notebook的安装与使用

jupyter notebook的安装需要在已经安装配置好的conda环境下 win r 打开运行窗口 输入cmd回车 在cmd窗口中输入以下命令 conda install jupyter notebook安装完成后启动 jupyter notebook 也是在cmd窗口 输入 : jupyter notebook运行成功后第一次打开的时候需要选择一个浏览…

如何在Ubuntu上构建编译LLVM和ISPC,以及Ubuntu上ISPC的使用方法

之前一直在 Mac 上使用 ISPC&#xff0c;奈何核心/线程太少了。最近想在 Ubuntu 上搞搞&#xff0c;但是 snap 安装的 ISPC不知道为什么只能单核&#xff0c;很奇怪&#xff0c;就想着编译一下&#xff0c;需要 Clang 和 LLVM。但是 Ubuntu 很搞&#xff0c;他的很多软件版本是…