【Q13】
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 is simply X
+ II
. The number twenty seven is written as XXVII
, which is XX
+ V
+ II
.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII
. Instead, the number four is written as IV
. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX
. There are six instances where subtraction is used:
-
I
can be placed beforeV
(5) andX
(10) to make 4 and 9. -
X
can be placed beforeL
(50) andC
(100) to make 40 and 90. -
C
can be placed beforeD
(500) andM
(1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: "III" Output: 3
Example 2:
Input: "IV" Output: 4
Example 3:
Input: "IX" Output: 9
Example 4:
Input: "LVIII" Output: 58 Explanation: L = 50, V= 5, III = 3.
Example 5:
Input: "MCMXCIV" Output: 1994 Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
解法:从高位至低位倒序遍历,遇到遇到I/X/C时判断此时数值,若此时数值大于5/50/500,则对数值依次减去1/10/100,其余情况下加上对应数字即可。
class Solution: def romanToInt(self, s): """ :type s: str :rtype: int """ op = 0 for x in reversed(s): if x=='I': op += 1 if op<5 else -1 elif x=='V': op += 5 elif x=='X': op += 10 if op<50 else -10 elif x=='L': op += 50 elif x=='C': op += 100 if op<500 else -100 elif x=='D': op += 500 else: op += 1000 return op
【Q14】
Write a function to find the longest common prefix string amongst an array of strings.
If there is no common prefix, return an empty string ""
.
Example 1:
Input: ["flower","flow","flight"] Output: "fl"
Example 2:
Input: ["dog","racecar","car"] Output: "" Explanation: There is no common prefix among the input strings.
Note:
All given inputs are in lowercase letters a-z
.
解法:先找到最短的字符串,以此为基准。遍历整个字符串数组,取每个单词依次与该最短字符串比较。
class Solution: def longestCommonPrefix(self, strs): """ :type strs: List[str] :rtype: str """ if len(strs)==0: return "" shortestStr = min(strs,key=len) # find shortest string in the list for i in range(len(shortestStr)): for s in strs: if s[i]!=shortestStr[i]: return shortestStr[:i] return shortestStr
【Q15】
Given an array nums
of n integers, are there elements a, b, c in nums
such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note:
The solution set must not contain duplicate triplets.
Example:
Given array nums = [-1, 0, 1, 2, -1, -4], A solution set is: [ [-1, 0, 1], [-1, -1, 2] ]
解法:先固定一个数A,则任务变成寻找数组里的另外两个数,使得这两个数的和Target=0-A,此时问题变成2Sum问题。需要注意的是可能存在数组内有重复元素的问题,此时可通过while语句直接跳过重复元素。
class Solution: def threeSum(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ nums.sort() N = len(nums) result = [] for k in range(N): if k>0 and nums[k]==nums[k-1]: continue target = 0-nums[k] i,j = k+1,N-1 while i<j: if nums[i]+nums[j]==target: result.append([nums[k],nums[i],nums[j]]) i += 1 j -= 1 while i<j and nums[i]==nums[i-1]: i += 1 elif nums[i]+nums[j]<target: i += 1 else: j -= 1 return result