- ???? 作者:烧洋芋的土豆
- ???? 内容:使用Java语言刷Leetcode算法题
- ???? 技术交流:分享日常学习知识,平常遇到的问题,一些学习资料,一起学习,一起进步。
( )
???? 66. 加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0] 输出:[1]
提示:
- 1 <= digits.length <= 100
- 0 <= digits[i] <= 9
代码和结果图如下:
class Solution {
public int[] plusOne(int[] digits) {
//从最后一个数开始遍历开始
for (int i = digits.length-1; i >= 0; i--) {
digits[i]++;
//获取当前数的余数
digits[i]=digits[i]%10;
//判断余数是否为0
if(digits[i]!=0){
return digits;
}
}
digits=new int[digits.length+1];
digits[0]=1;
return digits;
}
}
???? 69. x 的平方根
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留整数部分 ,小数部分将被舍去 。
注意:
不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
示例 1:
输入:x = 4 输出:2
示例 2:
输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。
提示:
- 0 <= x <= 231 - 1
代码和结果图如下:
class Solution {
public int mySqrt(int x) {
//判断是否等于0,返回本身
if(x==0)return 0;
//调用求平方根的方法,转化为整数
int sqrt = (int) Math.sqrt(x);
return sqrt;
}
}
???? 70. 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1 阶 + 1 阶 2 阶
示例 2:
输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 1 阶 + 1 阶 + 1 阶 1 阶 + 2 阶 2 阶 + 1 阶
解析:
爬到x级台阶的方案数是爬到第x-1级台阶方案数和爬到x-2方案数之和,因为每次只能爬1级或者2级,这里所以就是求前面2级之和。
代码和结果图如下:
class Solution {
public int climbStairs(int n) {
int i=0,j=0,z=1;
for (int i1 = 1; i1 <= n; i1++) {
i=j;
j=z;
z=i+j;
}
return z;
}
}
???? 83. 删除排序链表中的重复元素
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次返回已排序的链表 。
示例 1:
输入:head = [1,1,2] 输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
提示:
- 链表中节点数目在范围 [0, 300] 内
- -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
代码和结果图如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//创建一个链表来代替head
ListNode cur = head;
//循环遍历
while(cur != null && cur.next != null) {
//判断第一个值和下一个值是否相等
if(cur.val == cur.next.val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
}
}
???? 67. 二进制求和
给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。
示例 1:
输入:a = "11", b = "1" 输出:"100"
示例 2:
输入:a = "1010", b = "1011" 输出:"10101"
提示:
- 1 <= a.length, b.length <= 104
- a 和 b 仅由字符 '0' 或 '1' 组成
- 字符串如果不是 "0" ,就不含前导零
代码和结果图如下:
class Solution {
public String addBinary(String a, String b) {
StringBuffer ans = new StringBuffer();
//获取最大长度
int n = Math.max(a.length(), b.length()), carry = 0;
//最大长度遍历
for (int i = 0; i < n; ++i) {
carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
//字符串组合
ans.append((char) (carry % 2 + '0'));
carry /= 2;
}
if (carry > 0) {
ans.append('1');
}
//字符串反向
ans.reverse();
return ans.toString();
}
}
???? 总结
这几道算法题主要是采用Java基础知识来实现的,还有个别题用到了里面的方法偷个懒,后续的题目会越来越难,希望大家多多鼓励,让我们一起坚持下来,一起加油 ! ! !