# 题目来源：LeetCode

# easy

## 1. Two Sum

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

1 | public int[] twoSum(int[] nums, int target) { |

## 7. Reverse Integer

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

Input: 123

Output: 321

Example 2:

Input: -123

Output: -321

Example 3:

Input: 120

Output: 21

Note:

Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

1 | public static void main(String[] args) { |

## 13. Roman to Integer

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 before V (5) and X (10) to make 4 and 9.

X can be placed before L (50) and C (100) to make 40 and 90.

C can be placed before D (500) and M (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.

1 | class Solution { |

说明：每一位比如 X、L、C、D、M都可以独立存在的，即可以独立表示为500这种，所以直接按位读取即可。

## 14. Longest Common Prefix

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`

.

1 | public class study0112_1 { |

## 38.Count and Say

The count-and-say sequence is the sequence of integers with the first five terms as following:

- 1
- 11
- 21
- 1211
- 111221

1 is read off as “one 1” or 11.

11 is read off as “two 1s” or 21.

21 is read off as “one 2, then one 1” or 1211.

Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence.

Note: Each term of the sequence of integers will be represented as a string.

Example 1:

Input: 1

Output: “1”

Example 2:

Input: 4

Output: “1211”

1 | public static void main(String[] args) { |

# Medium

## 2. Add Two Numbers

You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

Example:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)

Output: 7 -> 0 -> 8

Explanation: 342 + 465 = 807.

1 | class Solution { |

## 3. Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters.

Example 1:

Input: “abcabcbb”

Output: 3

Explanation: The answer is “abc”, with the length of 3.

Example 2:

Input: “bbbbb”

Output: 1

Explanation: The answer is “b”, with the length of 1.

Example 3:

Input: “pwwkew”

Output: 3

Explanation: The answer is “wke”, with the length of 3.

Note that the answer must be a substring, “pwke” is a subsequence and not a substring.

1 | public static void main(String[] args) { |

说明：

- 维持一个最大值，遍历整个字符串，遍历经过的那个字符作为 subString 的末尾，将重复的char及更前面的全部删掉（使用 map和反map进行编号与定位）。
- 将重复处到遍历点之间重新编号（从1 开始）。

## 5. Longest Palindromic Substring

Input: “babad”

Output: “bab”

Note: “aba” is also a valid answer.

思路：最长回文子串：

- 维护一个二维数组dp[i][j]，保存的是i、j的长度。
- 如果不是回文串，保存的是0.
- 先对1位、2位进行存入数组，之后就可以叠加了。

1 | package com.examination.learn; |

## 12. Integer to Roman

阿拉伯数字转罗马数字

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 before V (5) and X (10) to make 4 and 9.

X can be placed before L (50) and C (100) to make 40 and 90.

C can be placed before D (500) and M (1000) to make 400 and 900.

Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 to 3999.

Example 1:

Input: 3

Output: “III”

Example 2:

Input: 4

Output: “IV”

Example 3:

Input: 9

Output: “IX”

Example 4:

Input: 58

Output: “LVIII”

Explanation: L = 50, V = 5, III = 3.

Example 5:

Input: 1994

Output: “MCMXCIV”

Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

1 | public static void main(String[] args) { |

## 15. 3Sum

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]

]

1 | public static void main(String[] args) { |

## 33.Search in Rotated Sorted Array

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e.,`[0,1,2,4,5,6,7]`

might become `[4,5,6,7,0,1,2]`

).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Your algorithm’s runtime complexity must be in the order of `O(log n)`

.

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0

Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3

Output: -1

1 | class Solution { |

说明：对于循环数组的二分查找，要求时间复杂度为O(logN)。

思路（分治、递归）：

- 实现一个方法A：将数组第一个元素与mid比较，如果小于 mid ，说明数组的前一半有序；如果大于mid，说明数组后一半有序。
- 那么有序的一半采用常规二分，无序的一半依然是循环数组，将递归方法A。

# hard

## 4. Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]

nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]

nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

说明：

- 标准答案居然是直接 sort ！！！ hard 界的耻辱！
- 所以我留下了不同的解法，如下
- 以下代码虽然没有 AC ，但我解决的是找中位数的问题，表示解决的很满意。

1 | public static void main(String[] args) { |