题目来源:leetcode
一、简单
✓ 两数之和
public int[] twoSum(int[] nums, int target) {
HashMap<Integer,Integer> sum=new HashMap<>();
for(int i=0;i<nums.length;i++){
if(sum.containsKey(target-nums[i])){
return new int[]{sum.get(target-nums[i]),i};
}
sum.put(nums[i],i);
}
return new int[]{};
}
✓ 回文数
public boolean isPalindrome(int x) {
String str=String.valueOf(x);
int i=0;
int j=str.length()-1;
do{
if(str.charAt(i)!=str.charAt(j)){
break;
} else if(i>=j){
return true;
}
i++;
j--;
}while(i<str.length());
return false;
}
✓ 罗马数字转整数
public int romanToInt(String s) {
Map<Character, Integer> map = new HashMap<>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
int result = 0;
int prev = 0;
for (int i = s.length() - 1; i >= 0; i--) {
int curr = map.get(s.charAt(i));
if (curr < prev) {
result -= curr;
} else {
result += curr;
}
prev = curr;
}
return result;
}
✓ 最长公共前缀
public String longestCommonPrefix(String[] strs) {
if (strs == null || strs.length == 0) {
return "";
}
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) {
return "";
}
}
}
return prefix;
}
✓ 有效的括号
public boolean isValid(String s) {
if (s == null || s.length() == 0) {
return false;
}
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(map.containsKey(c)){//)]}
if(stack.isEmpty() || stack.peek()!= map.get(c)){
return false;
}
stack.pop();
}else{
stack.push(c);
}
}
return stack.isEmpty();
}
✓ 合并两个有序链表
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode l3=new ListNode();
ListNode l3_temp=l3;
while(list2!=null&&list1!=null){
if(list1==null){
l3=list2;
break;
}
if(list1.val<list2.val){
l3_temp.next=list1;
list1=list1.next;
}else{
l3_temp.next=list2;
list2=list2.next;
}
l3_temp=l3_temp.next;
}
if(list1!=null){
l3_temp.next=list1;
}else{
l3_temp.next=list2;
}
return l3.next;
}
✓ 删除有序数组中重复的元素
public static int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int i = 0;
for(int j=1;j<nums.length;j++){
if(nums[j]!=nums[i]){
i++;
nums[i]=nums[j];
}
}
return i + 1;
}
✓ 移除元素
public int removeElement(int[] nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast]!=val) {
nums[slow++] = nums[fast];
}
}
// 数组尾部置0
nums=Arrays.copyOf(nums,slow);
return nums.length;
}
✓ 找出字符串中第一个匹配项的下标
public static int strStr(String haystack, String needle) {
if(needle.length() == 0){
return 0;
}
return haystack.indexOf(needle);
}
✓ 搜索插入位置
public static int searchInsert(int[] nums, int target) {
if(nums.length == 0){
return 0;
}
for(int i=0;i<nums.length;i++){
if(nums[i]==target){
return i;
}
}
for(int i=0;i<nums.length;i++){
if(nums[i]>target){
nums[i]=target;
return i;
}else if(i==nums.length-1){
nums[i]=target;
return i+1;
}
}
return 0;
}
✓ 返回最后一个单词的长度
public static int lengthOfLastWord(String s) {
String[] words = s.split(" ");
return words[words.length - 1].length();
}
✓ 数组加一
public static int[] plusOne(int[] digits) {
int carry = 1;
for (int i = digits.length - 1; i >= 0; i--) {
digits[i] += carry;
carry = digits[i] / 10;
digits[i] %= 10;
}
if (carry == 1) {
int[] result = new int[digits.length + 1];
result[0] = 1;
System.arraycopy(digits, 0, result, 1, digits.length);
return result;
} else {
return digits;
}
}
✓ 二进制求和
public static String addBinary(String a, String b) {
int maxLength = Math.max(a.length(), b.length());
StringBuilder sb = new StringBuilder();//StringBuilder类用来构建字符串
int carry = 0;
// 相加,并模拟加法进位
for (int i = 0; i < maxLength; i++) {
// 取两个字符串对应位的数值
int x = i < a.length() ? a.charAt(a.length() - 1 - i) - '0' : 0;
int y = i < b.length() ? b.charAt(b.length() - 1 - i) - '0' : 0;
int sum = x + y + carry;
sb.append(sum % 2);
carry = sum / 2;
}
if (carry > 0) {
sb.append(carry);// 若有进位,在最前面加1
}
return sb.reverse().toString();// 翻转返回字符串
}