分析 把具体的情况一个一个实现即可,没有什么幺蛾子. 代码 class Solution { public int romanToInt(String s) { int ans = 0; for (int i=0; i!=s.length(); ++i) { switch(s.charAt(i)) { case 'I': if(i<s.length()-1 && (s.charAt(i+1)=='X' || s.charAt(i+1)=='V')) { ans--; break; }…
分析 注意到跳跃的方向是一致的,所以我们需要维护一个数接下来跳到哪里去的问题.换句话说,就是对于一个数\(A_i\),比它大的最小值\(A_j\)是谁?或者反过来. 这里有两种方案,一种是单调栈,简单说一下思路:维护一个递减的单调栈,每次放入元素时将比它大的栈顶元素弹出(说明这些元素都能在递减的情况下都能跳到它),直到没有元素或者没有符合条件的元素位置.反过来依然,然后扫一遍就可以了. 这里采用Java的TreeMap解决问题(也就是c++的map).我们倒过来遍历一遍这个数组,那么只要Tree…
分析 与其说是算法题,不如说是语言特性题. 这题要是对Java的String相关函数掌握的比较熟练,写起来的速度(各种意义上)就会很快. 大致的思路都是一致的,差不到哪里去,无非是枚举长度.值得一提的是,从长到短的枚举顺序要比从短到长优得多. 代码 class Solution { public String longestCommonPrefix(String[] strs) { if (strs == null || strs.length == 0) { return ""; }…
1. 原题链接 https://leetcode.com/problems/roman-to-integer/description/ 2. 题目要求 (1)将罗马数字转换成整数:(2)范围1-3999: 3. 关于罗马数字 罗马数字相关规则已经在之前一篇博客里写过,这里不再赘述(之前博客的传送门) 4. 解题思路 (1)这与之前第十二题Integer转换Roman虽然很相似,但处理方法并不相同.罗马数字更像是一个字符串,因此将其转换成字符数组进行处理. (2)从后向前遍历一次,结合罗马数字的组…
Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 V 5 X 10 L 50 C 100 D 500 M 1000 For example, two is written as II in Roman numeral, just two one's added together. Twelve is written as, XII, which i…
分析 好久不刷题真的思维僵化,要考虑到这样一个结论:如果递增的三个数\(x_i,x_{i+1},x_{i+2}\)不符合题意,那么最大的两边之差一定大于等于第一条边,那么任何比第一条边小的都不能成立.这样一来,递增排序,然后线性找就可以了. 代码 class Solution { public: int largestPerimeter(vector<int>& A) { int ans=0; sort(A.begin(),A.end()); for(int i=A.size()-3;…
Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 time=272ms accepted public class Solution { public int reverse(int x) { long recv=0; int mod=0; int xabs=Math.abs(x); while(xabs>0){ mod=xabs%…
题目描述 罗马数字包含以下七种字符: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 得到的数…
一天一道LeetCode系列 (一)题目 Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. (二)解题 和上一题相反,这题将罗马数字转换成整形数. 注意到 4,9,40,90,400,900这些特殊的数字的区别就不难写出代码了. class Solution { public: int romanToInt(string s) {…
https://leetcode.com/problems/roman-to-integer/ 原题: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999. 思路: 关键是要搞清罗马数字规则.PS:不用考虑错误输入. 核心: 遍历一遍,相同字母合并成对应数,然后比较如果比它后面的小就减去,否则就加上.时间复杂度O(n). 具体解析: 基…