LeetCode-1822/1502/896/13

2024-01-09 13:36
文章标签 leetcode 13 1822 896 1502

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

1.数组元素积的符号(1822)

题目描述:

已知函数 signFunc(x) 将会根据 x 的正负返回特定值:

如果 x 是正数,返回 1 。
如果 x 是负数,返回 -1 。
如果 x 是等于 0 ,返回 0 。
给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。

返回 signFunc(product) 。
在这里插入图片描述
思路: 这题比较简单,只需要初始设置一个变量为1,然后遍历数组,数组元素为正不操作,为0则直接返回0,为负则给设置的遍历乘以-1,最终返回该变量即可。但是这里要注意题目中谈到了signFunc函数,不过它实现起来也很简单。

代码:

class Solution {public int arraySign(int[] nums) {int sum=1;for(int i=0;i<nums.length;i++) {if(nums[i]==0) {return signFunc(nums[i]);} else if(nums[i]<0) {sum*=signFunc(nums[i]);}}return signFunc(sum);}public int signFunc(int n) {if(n<0) {return -1;} else if(n==0) {return 0;} else {return 1;}}
}

2.判断能否形成等差数列(1502)

题目描述:

给你一个数字数组 arr 。

如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。

如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。
在这里插入图片描述
思路: 这里首先通过位置0与位置1元素的差得到差值,然后遍历数组,计算相邻两个元素的差,如果有一个差值不等于开始计算的差值,则直接返回false;

代码:

class Solution {public boolean canMakeArithmeticProgression(int[] arr) {Arrays.sort(arr);int val=arr[1]-arr[0];for(int i=1;i<arr.length-1;i++) {if(val!=(arr[i+1]-arr[i])) {return false;}}return true;}
}

3.单调数列(896)

题目描述:

如果数组是单调递增或单调递减的,那么它是 单调 的。

如果对于所有 i <= j,nums[i] <= nums[j],那么数组 nums 是单调递增的。 如果对于所有 i <= j,nums[i]> = nums[j],那么数组 nums 是单调递减的。

当给定的数组 nums 是单调数组时返回 true,否则返回 false。
在这里插入图片描述
思路一: 首先要得到第二个元素和第一个元素的差,这样我们才可以进行后续的判断,如果是正数则该数组可能单增,如果是负数则该数组可能单减。但是要注意一个问题,如果首部的元素都是相等的那么这种方法就适用不了了?还是可以的,只要加一个while循环遍历到不相等的数即可。得到差值后分两种情况,差值大于0的情况,用一个for循环不断得到相邻元素差值,如果有一个差值小于0返回false。差值小于0情况同理,有一个差值大于0返回false。如果没出现上述的false情况就返回true。

思路二: 因为数组不是单增就是单减,我们建立两个布尔型变量初始值设为true分别记录单增和单减的情况。使用一个循环对数组进行遍历,如果出现差值为负则将一个变量设为false,同理如果出现差值为正则将另一个变量设为false。然后遍历完成最后返回两个布尔型变量的||即可。具体看代码。

代码:

class Solution {public boolean isMonotonic(int[] nums) {return isMonotonic2(nums);}public boolean isMonotonic1(int[] nums) {if(nums.length==1) {return true;}boolean flg=true;int k=1;while(k<nums.length&&nums[0]==nums[k]) {k++;}if(k==nums.length) {return true;}if(nums[k]-nums[0]>0) {for(int i=1;i<nums.length;i++) {if(nums[i]-nums[i-1]<0) {flg=false;}}} else if(nums[k]-nums[0]<0){for(int i=1;i<nums.length;i++) {if(nums[i]-nums[i-1]>0) {flg=false;}}}return flg;}public boolean isMonotonic2(int[] nums) {boolean inc=true,der=true;for(int i=1;i<nums.length;i++) {if(nums[i]-nums[i-1]<0) {inc=false;}if(nums[i]-nums[i-1]>0) {der=false;}}return inc||der;}
}

4.罗马数字转整数(13)

题目描述:

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
在这里插入图片描述
思路: 这里的思路是从左至右来处理这个字符串,设置返回数sum初值为0,如果遇到V L D M则直接在sum上加上相应的值。如果遇到I 则要判断下一个字母是否为V 或 X,如果是则加上4或9并且索引要多加一位,因为这里一次性处理掉了两个字符,如果下一个字母不是V或X则直接在sum上加上1就行。至于遇到X C与这里遇到I的处理是一致的不多赘述,具体看代码。

代码:

class Solution {public int romanToInt(String s) {int len=s.length();int sum=0;for(int i=0;i<len;i++) {switch(s.charAt(i)) {case 'I':if(i+1<len&&s.charAt(i+1)=='V') {sum+=4;i++;} else if(i+1<len&&s.charAt(i+1)=='X') {sum+=9;i++;} else {sum+=1;}break;case 'V':sum+=5;break;case 'X':if(i+1<len&&s.charAt(i+1)=='L') {sum+=40;i++;} else if(i+1<len&&s.charAt(i+1)=='C') {sum+=90;i++;} else {sum+=10;}break;case 'L':sum+=50;break;case 'C':if(i+1<len&&s.charAt(i+1)=='D') {sum+=400;i++;} else if(i+1<len&&s.charAt(i+1)=='M') {sum+=900;i++;} else {sum+=100;}break;case 'D':sum+=500;break;case 'M':sum+=1000;break;}}return sum;}
}

这篇关于LeetCode-1822/1502/896/13的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

哈希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

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

poj 1502 MPI Maelstrom(单源最短路dijkstra)

题目真是长得头疼,好多生词,给跪。 没啥好说的,英语大水逼。 借助字典尝试翻译了一下,水逼直译求不喷 Description: BIT他们的超级计算机最近交货了。(定语秀了一堆词汇那就省略吧再见) Valentine McKee的研究顾问Jack Swigert,要她来测试一下这个系统。 Valentine告诉Swigert:“因为阿波罗是一个分布式共享内存的机器,所以它的内存访问

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

【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 解题思路 这道题的思路是使用动态规划