一,数组
1.删除排序中的重复项
错误方法
正确方法
2.购买股票的最佳时机ll
class Solution {
public int maxProfit(int[] prices) {
int lirun =0;
if(prices.length>=1){
for(int i=1;i<prices.length;i++){
if(prices[i-1]<prices[i]){
lirun+= prices[i]-prices[i-1];
}}
}
return lirun; }
}
3.旋转数组
错误代码:超出时间限制
class Solution {
public void rotate(int[] nums, int k) {
int a =0;
if(nums.length>1){
for(int j=0;j<k;j++){
a=nums[nums.length-1];
for(int i=nums.length-1;i>0;i--){
nums[i]=nums[i-1];}
nums[0]=a;
}}
}}
正确代码
4.存在重复元素
使用set集合有不重复性的原则筛选
class Solution {
public boolean containsDuplicate(int[] nums) {
Set a = new HashSet<>();
for(int num : nums){
if(!a.add(num)){
return true;
} } return false;}}
5.
使用set不重复的属性筛选出数组中重复属性并去除
class Solution {
public int singleNumber(int[] nums) {
Set a = new HashSet<>();
for(int num:nums){
if(!a.add(num)){
//set的去除语句
a.remove(num);}}
return (int) a.toArray()[0]; }}
6.两个数组的交集
Arrays.sort(nums1);对数组排序
List<Integer> a = new ArrayList<>();创建list列表
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
List<Integer> a = new ArrayList<>();
//排序
Arrays.sort(nums1);
Arrays.sort(nums2);
int i=0;
int j=0;
while(i < nums1.length && j < nums2.length){
if(nums1[i]>nums2[j]){
j++;
}else if(nums1[i]<nums2[j]){
i++;
}else{
a.add(nums1[i]);
i++;
j++;}}
int c=0;
int[] res = new int[a.size()];
for (int k = 0; k<a.size();k++) {
res[c++] = a.get(k);
} return res; }}
6.加一
class Solution {
public int[] plusOne(int[] digits) {
for(int i=digits.length-1;i>=0;i--){
if(digits[i]!=9){
++digits[i];
return digits;
}else{
digits[i]=0;
}}
int []a = new int[digits.length+1];
a[0]=1;
return a;}}
7.移动零
class Solution {
public void moveZeroes(int[] nums) {
int b=0;
for(int i=0;i<nums.length;i++){
if(nums[i] != 0){
nums[b++]=nums[i];
}}
for(int i=b;i<nums.length;i++){
nums[i]=0;}}}
8.两数之和
错误没有嵌套第二层循环
class Solution {
public int[] twoSum(int[] nums, int target) {
int a=0;
if(target-nums[a++]>0)
{
for(int i=a;i<nums.length;i++)
{
if(nums[a-1]+nums[i]==target)
{
int b[]= new int[]{a-1,i};
return b; } }} }}
正确代码(不懂)
使用HashMap
存储:put 方法 put(key,value)
查询 : get 方法 get(key)
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> a = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (a.get(target - nums[i]) != null) {
return new int[]{a.get(target - nums[i]), i};
}
a.put(nums[i], i);
}
return new int[]{0, 0};
}
}
9.
二.字符串
1.反转字符串
class Solution {
public void reverseString(char[] s) {
char abb;
for(int i=0;i<s.length/2;i++){
abb=s[i];
s[i]=s[s.length-1-i];
s[s.length-1-i]=abb;
}}}
2.整数反转
需要假设环境不允许存储 64 位整数(有符号或无符号)的环境,所以使用long
class Solution {
public int reverse(int x) {
long a=0;
while(x!=0){
a=a*10+x%10;
x=x/10;
}
return (int)a == a?(int)a:0;
}
}
3.查找字符串中第一个唯一字符
使用api
indexOf()从前往后查找,lastIndexOf()从后往前查找
class Solution {
public int firstUniqChar(String s) {
for (int i = 0; i < s.length(); i++)
if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i)))
return i;
return -1;
}
}
4.有效字母异位词
先创建两个s,t的集合,使用arrays.sort排序,最后用Arrays.equals(s,t)类比
class Solution {
public boolean isAnagram(String s, String t) {
char[] sChar = s.toCharArray();
char[] tChar = t.toCharArray();
Arrays.sort(sChar);
Arrays.sort(tChar);
return Arrays.equals(sChar, tChar);
}
}
5.验证回文串
错误代码
class Solution {
public boolean isPalindrome(String s) {
char []a = new char[]();
int j=0
for(int i=0;i<s.length;i++){
if(!Character.isLetterOrDigit(s[i])){
char[j]=s[i]
j++
}
}
int a=0;
for (int i = 0; i < s.length(); i++)
if (s.indexOf(s.charAt(i)) == s.lastIndexOf(s.charAt(i))){
a++;
}
}
}
正确代码
使用Character.isLetterOrDigit判断是不是字母和数字
s.charAt(l)s.charAt(r)查找到左右两边的字母或数字
Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)判断是否相同
class Solution {
public boolean isPalindrome(String s) {
int l=0,r=s.length()-1;
while(l<r){
while(l<r&&!Character.isLetterOrDigit(s.charAt(l))){
l++;
}
while(l<r&&!Character.isLetterOrDigit(s.charAt(r))){
r--;
}
if (Character.toLowerCase(s.charAt(l)) != Character.toLowerCase(s.charAt(r)))
{ return false;}
l++;
r--;
}
return true;
}
}
6.字符串转换整数 (atoi)(不会)
7.实现strStr()
错误代码:
class Solution {
public int strStr(String haystack, String needle) {
Char []a=new char[]();
for(int i=0;i<haystack.length;i++){
if(haystack(i)==needle(i)){
for(int j=0;j<needle.length;j++){
int b=i;
char(j)=haystack(b++);
}
}
if(char==needle)
return 0;
else
return -1;
}
if(char==needle)
return 0;
else
return -1;}}
正确代码
8.外观数列
class Solution {
public String countAndSay(int n) {
if(n==1){
return "1";
}
//获取n-1的数列
String s1 = countAndSay(n-1);
建造StringBuilder容器
StringBuilder builder = new StringBuilder();
char a = s1.charAt(0);
int b = 0 ;
for(int i=0;i<s1.length();i++)
{
if(s1.charAt(i)==a){
b++;
}else{
向容器中添加计数器的值
builder.append(b);
添加本身值
builder.append(a);
重新定义量
a = s1.charAt(i);
b = 1;}}
builder.append(b);
builder.append(a);
输出string形式builder
return builder.toString();}}
三.链表
1.删除链表中的节点(没懂)
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;}}
目标:杀掉A
正常杀手需要找到A的把柄才可以杀掉A,
可现在找到A本人后竟然没有可以获取A把柄的途径
A得知我们要杀他,心生一计,可助你完成任务
A说我有B的把柄,你杀了B,我改头换面,以B的身份活着
GC也会自动清理掉B的尸体,没人会知道的
2.删除链表的倒数第n个节点
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode n1 = head;
int last = length(head) - n;
if(last == 0){
return head.next;}
for(int i=0; i<last-1;i++){
n1 = n1.next;}
n1.next=n1.next.next;
return head;}
private int length(ListNode head) {
int len = 0;
while (head != null) {
len++;
head = head.next;}
return len;}
3.反转链表
public ListNode reverseList(ListNode head) {
ListNode newhead = null;
while(head != null){
//为下次循环创建节点
ListNode n1 = head.next;
//head.next在newhead的头节点
head.next = newhead;
创建新的节点为head现在的节点
newhead = head;
head = n1;
}
return newhead;
}
4.合并两个有序链表
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if(list1 == null){
return list2;
}
if(list2 == null){
return list1;
}
ListNode n2 = new ListNode(0);
ListNode n1 = n2;
while(list1!=null&&list2!=null){
if(list1.val>=list2.val){
n1.next = list2;
list2= list2.next;
}else{
n1.next =list1;
list1=list1.next;
}
n1=n1.next;
}
n1.next = list1 !=null?list1:list2;
return n2.next;
}
5.回文链表
public boolean isPalindrome(ListNode head) {
ListNode f = head;
ListNode s = head;
while(f!=null&&f.next!=null){
s=s.next;
f=f.next.next;
}
if(f!=null){
s=s.next;
}
s = res(s);
f = head;
while(s!=null){
if(s.val!=f.val)
return false;
s=s.next;
f=f.next;
}
return true;
}
public ListNode res(ListNode head){
ListNode n1 = null;
while(head!=null){
ListNode next= head.next;
head.next = n1;
n1 = head ;
head = next;
}
return n1;
}
6.环形链表
public boolean hasCycle(ListNode head) {
ListNode f =head;
ListNode s = head;
while(f!=null&&f.next!=null){
f=f.next.next;
s=s.next;
if(s==f){
return true;
}
}
return false;
}
四.树
1.二叉树最大深度
public int maxDepth(TreeNode root) {
return root==null? 0 : Math.max(maxDepth(root.left), maxDepth(root.right))+1;
}
不懂的一种写法
public int maxDepth(TreeNode root) {
if (root == null)
return 0;
//创建一个队列
Deque<TreeNode> deque = new LinkedList<>();
deque.push(root);
int count = 0;
while (!deque.isEmpty()) {
//每一层的个数
int size = deque.size();
while (size-- > 0) {
TreeNode cur = deque.pop();
if (cur.left != null)
deque.addLast(cur.left);
if (cur.right != null)
deque.addLast(cur.right);
}
count++;
}
return count;
}
2.验证二叉探索树
五.排序和探索
1.合并两个有序数组
错误版本(当nums1或nums2中有null时,不能使用)
public void merge(int[] nums1, int m, int[] nums2, int n) {
int []a = new int[m+n];
int i=0;
int j=0;
int b=0;
while((j<n||i<m)){
if(nums1[i]<=nums2[j]){
if(nums1[i]!=0){
a[b++]=nums1[i++];
}else{
a[b++]=nums2[j++]; }
}else{
if(nums2[i]!=0){
a[b++]=nums2[j++];
}else{
a[b++]=nums1[i++]; }}}
for (int k = 0; k < m + n; k++) {
nums1[k] = a[k]; } }
正确版本
数据结构方法
public void merge(int[] nums1, int m, int[] nums2, int n) {
int i = m-1;
int j = n-1;
int c = n+m-1;
while(j>=0){
nums1[c--] = (i >= 0 && nums1[i] > nums2[j])?nums1[i--]:nums2[j--];
}
}
2.
六.动态规划
1.爬梯子
复杂性高,时间超时方法
public int climbStairs(int n) {
if(n<=1)
return 1;
if(n<3)
return n;
int a = climbStairs(n-1)+climbStairs(n-2);
return a;
}
可以使用多方法定义来使用(但是时间还是大)
public static int climbStairs(int n) { return Fibonacci(n, 1, 1); }
public static int Fibonacci(int n, int a, int b) {
if (n <= 1)
return b;
return Fibonacci(n - 1, b, a + b);
}
在一个方法的实现
public int climbStairs(int n) {
if (n <= 1)
return 1;
int[] a = new int[n + 1];
a[1] = 1;
a[2] = 2;
for (int i = 3; i <= n; i++) {
a[i] = a[i - 1] + a[i - 2]; }
return a[n];}
2.买卖股票的最佳时机
超时
public int maxProfit(int[] prices) {
int a =0;
int i=0;
int j=0;
for(i=1;i<prices.length;){
while(j<prices.length){
a=Math.max(prices[i]-prices[i-1],a);
}
}
return a;
}
正确
public int maxProfit(int[] prices) {
if(prices==null||prices.length==0)
return 0;
int max =0;
int min =prices[0];
for(int i=0;i<prices.length;i++){
min = Math.min(prices[i],min);
max = Math.max(prices[i]-min,max);}
return max; }
3.最大子序和
public int maxSubArray(int[] nums) {
int max = nums[0];
int[]a = new int[nums.length];
a[0]=nums[0];
for(int i =1;i<nums.length;i++){
用创建的数组来表示子序和,当子序和为负数时,子序取0,再从头开始
a[i] = Math.max(a[i-1],0) + nums[i];
max = Math.max(max,a[i]);
}
return max;
}