Java版:
1.两数之和:hash表法:key:value = nums[i]:i
hash有对应差值,得到结果,否则添加到hash中
class Solution {
public int[] twoSum(int[] nums, int target) {
Map hasd = new HashMap<>();
for(int i=0;i
2.整数反转:
判断是否溢出a>Integer.MAX_VALUE/10 || (a==Integer.MAX_VALUE/10 && pop > 7和a
class Solution {
public int reverse(int x) {
int a = 0;
while(x != 0){
int pop = x%10;
if(a>Integer.MAX_VALUE/10 || (a==Integer.MAX_VALUE/10 && pop > 7)){
return 0;
}
if(a
3.回文数:
关键:如何判断反转了一半:我们将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。
对10取余获得尾数,除10去掉个位数。
10的整数要提前判断
class Solution {
public boolean isPalindrome(int x) {
if(x < 0 || (x % 10 == 0 &&x!=0)) return false;
int a=0;
while(x>a){
a = a*10 + x%10;
x = x/10;
}
return x == a || x == a/10;
}
}
罗马数字:大数在小数左边,小数在大数右边取负
int num = 0;
if (a.length() == 0) return 0;
Character[] code1 = new Character[]{'I', 'V', 'X', 'L','C', 'D', 'M'};
Integer[] code2 = new Integer[]{1, 5, 10, 50, 100, 500, 1000};
Map code = new HashMap<>();
for(int i = 0; i
括号匹配:主要使用栈进行判断
public boolean isValid(String s) {
Stack stack = new Stack();
for (int i = 0; i
合并有序列表:创建一个头指针用于返回,在创建一个用于插入操作,注意断链。
ListNode head = new ListNode(-1);
ListNode p = head;
while (l1!=null && l2!=null){
if (l1.val <= l2.val){
p.next = l1;
l1 = l1.next;
p = p.next;
}else {
p.next = l2;
l2 = l2.next;
p = p.next;
}
}
while (l1!=null){
p.next = l1;
l1 = l1.next;
p = p.next;
}
while (l2!=null){
p.next = l2;
l2 = l2.next;
p = p.next;
}
head = head.next;
return head;
删除排序数组重复项:维护2个指针,一个快指针,一个慢指针,快指针用于取项,慢指针用于更新
int i=0,j=0;
for(;j
移除元素:同样维护2个指针
public int removeElement(int[] nums, int val) {
int i=0, j =0;
for (;j
搜索插入位置:双指针法
if (nums[0] <= target) return 0;
int i = 0;
for (int j =1;j=target){
return j;
}else {
i++;
}
}
return nums.length;