001两数之和
代码(学习哈希) 002两数相加
代码(学习链表的创建和叠加) 003无重复字符的最长子串
代码(学习滑动窗口,暂时不会) 004寻找两个正序数组的中位数
代码 005最长回文子串
代码一(学习中心扩散法)代码二(学习动态规划,暂时不会) 006 Z字形变换
代码(找规律,周期性) 007整数反转
代码(公式) 008字符串转换整数
代码(公式) 009回文数
代码(Java底层函数) 010正则表达式匹配代码(学习动态规划,暂时不会)011盛最多水的容器
代码(双指针) 012整数转罗马数字
代码(暴力求解) 013罗马数字转整数
代码(找规律) 014最长公共前缀
代码(暴力求解) 015三数之和
代码(学习双指针)
001两数之和 代码(学习哈希)class Solution {
public int[] twoSum(int[] nums, int target) {
// 创建动态哈希表,元素顺序存取顺序不能保持一致
Mapmap=new HashMap();
// 遍历数组
for(int i=0;i
002两数相加
代码(学习链表的创建和叠加)
class Solution {
public ListNode addTwoNumbers(ListNode l1,ListNode l2) {
// 创建头结点
ListNode head=new ListNode();
// 指向head
ListNode node=head;
// 依次将每个结点相加,记得考虑进位
// 初始化进位为0
int so=0;
// 遍历两个链表叠加
// 直到两个链表均遍历完
ListNode p=l1;
ListNode q=l2;
while(p!=null||q!=null) {
// 初始化进位、两个对应结点的和为进位大小
int sum=so;
if(p!=null) {
sum+=p.val;
}
if(q!=null) {
sum+=q.val;
}
// 创建node的下一个结点,大小为sum%10;
node.next=new ListNode(sum%10);
// 更新进位
so=sum/10;
if(p!=null) {
p=p.next;
}
if(q!=null) {
q=q.next;
}
node=node.next;
}
// 叠加之后要考虑是否仍存在进位,是否需要创建新结点
if(so==1) {
node.next=new ListNode(so);
}
return head.next;
}
}
003无重复字符的最长子串
代码(学习滑动窗口,暂时不会)
004寻找两个正序数组的中位数
代码
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
// length1记录数组num1的长度
int length1=nums1.length;
// length2记录数组num2的长度
int length2=nums2.length;
// 如果有两个数组长度均为0
if(length1==0&&length2==0){
return 0;
}
// 如果其中一个数组长度为0
else if(length1==0||length2==0){
// 如果nums1的长度为0
if(length1==0){
// 如果nums2的长度为偶数
if(length2%2==0){
return (nums2[length2/2-1]+nums2[length2/2])/2.0;
}
// 如果nums2的长度为奇数
else{
return nums2[length2/2];
}
}
// 如果nums2的长度为0
else{
// 如果nums1的长度为偶数
if(length1%2==0){
return (nums1[length1/2-1]+nums1[length1/2])/2.0;
}
// 如果nums1的长度为奇数
else{
return nums1[length1/2];
}
}
}
// 两者长度均不为空
else{
// length记录数组的长度之和
int length=length1+length2;
// 如果长度之和为奇数
if(length%2!=0){
// 返回第几大的元素
int mid=length/2+1;
// 记录从小到大,第几个元素
int order=0;
// 遍历数组
for(int i=0,j=0;i=length1||j>=length2){
// nums1遍历完
if(i>=length1){
if(order=length1||j>=length2){
// nums1遍历完
if(i>=length1){
//表明一个还没找到
if(order
005最长回文子串
代码一(学习中心扩散法)
class Solution {
public String longestPalindrome(String s) {
// 中心扩散法
// 如果字符串的长度小于等于一
if(s.length()<=1){
return s;
}
else{
int start=0,end=0;
// 记录最长会问子串长度
int maxLength=0;
// 记录遍历中回文子串的长度
int length=1;
// 遍历字符串
for(int i=0;i=0&&s.charAt(m)==ch){
// 左移
m--;
length++;
}
// 其次往右遍历,相同则继续,否则结束。
while(n=0&&nmaxLength){
maxLength=length;
start=m+1;
end=n;
}
// 注意复原
length=1;
}
// substring(start,end)截取字符串[start,end)
return s.substring(start,end);
}
}
}
代码二(学习动态规划,暂时不会)
006 Z字形变换
代码(找规律,周期性)
class Solution {
public String convert(String s, int numRows) {
// 判断字符串的长度
// 如果字符串的长度小于等于行数或者行数为一时
if(s.length()<=numRows||numRows==1){
return s;
}
// 将字符串转换为字符数组
char[] arr=s.toCharArray();
// 记录输出的字符串
StringBuffer str=new StringBuffer();
// 同行中,一个周期中的第二个字符与下一个周期中第一个字符的间距
int other=0;
// 记录周期数
int distance=numRows+numRows-2;
// 遍历行数
for(int i=0;ij-distance&&j-other
007整数反转
代码(公式)
class Solution {
public int reverse(int x) {
int re=0;
while(x!=0){
if(reInteger.MAX_VALUE/10){
return 0;
}
//公式
re=re*10+x%10;
x/=10;
}
return re;
}
}
008字符串转换整数
代码(公式)
class Solution {
public int myAtoi(String s) {
// 去空格
String str=s.trim();
// 记录有效数字
long re=0;
// 判断是整数还是负数
// true代表整数
// false代表负数
boolean flag=true;
// 遍历字符串
for(int i=0;iInteger.MAX_VALUE){
return Integer.MAX_VALUE;
}
else if(!flag&&-re
009回文数
代码(Java底层函数)
class Solution {
public boolean isPalindrome(int x) {
// 回文数,可以利用StringBuffer的reverse反转函数
// 将n转换为StringBuffer类型
StringBuffer s=new StringBuffer(String.valueOf(x));
return s.reverse().toString().equals(String.valueOf(x));
}
}
010正则表达式匹配
代码(学习动态规划,暂时不会)
011盛最多水的容器
代码(双指针)
class Solution {
public int maxArea(int[] height) {
// 记录最大面积
int max=0;
// 数组长度
int length=height.length;
// 初始较低高度
int h=-1;
// 遍历数组
for(int i=0,j=length-1;ih){
max=Math.max(max,height[i]*(j-i));
h=height[i];
}
i++;
}
else if(height[i]>height[j]){
if(height[j]>h){
max=Math.max(max,height[j]*(j-i));
h=height[j];
}
j--;
}
}
return max;
}
}
012整数转罗马数字
代码(暴力求解)
class Solution {
public String intToRoman(int num) {
StringBuffer str=new StringBuffer("");
// 将会用到的罗马字符与对应的数字罗列出来
String[] arr1={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int[] arr2={1000,900,500,400,100,90,50,40,10,9,5,4,1};
// 遍历数组
for(int i=0;i=arr2[i]){
num-=arr2[i];
str.append(arr1[i]);
}
else{
i++;
}
}
return str.toString();
}
}
013罗马数字转整数
代码(找规律)
class Solution {
public int romanToInt(String s) {
// 记录整数
int num=0;
// 记录s的长度
int length=s.length();
// 求最后一个字符的罗马数字
char rear=s.charAt(length-1);
// 求最后一个字符的罗马数字对应的整数
switch(rear){
case 'I':
num=1;
break;
case 'V':
num=5;
break;
case 'X':
num=10;
break;
case 'L':
num=50;
break;
case 'C':
num=100;
break;
case 'D':
num=500;
break;
case 'M':
num=1000;
break;
}
// 字符串长度为1
if(s.length()==1){
return num;
}
// 字符串长度大于1
else{
// 记录当前遍历的罗马数字右边邻近的罗马数字对应的数字
int index1=num;
for(int i=length-2;i>=0;i--){
// 记录当前遍历的罗马数字
char front=s.charAt(i);
// 记录当前罗马数字对应得数字
int index2=0;
// 求罗马数字对应的数字
switch(front){
case 'I':
index2=1;
break;
case 'V':
index2=5;
break;
case 'X':
index2=10;
break;
case 'L':
index2=50;
break;
case 'C':
index2=100;
break;
case 'D':
index2=500;
break;
case 'M':
index2=1000;
break;
}
// 当前遍历的罗马数字小于右边邻近的数字时
if(index2
014最长公共前缀
代码(暴力求解)
class Solution {
public String longestCommonPrefix(String[] strs) {
int i=0,j=0;
// 第一个for循环:
// 遍历第一个字符串的字符
for( ;i0){
// 存在
return strs[0].substring(0,i);
}else{
// 不存在
return "";
}
}
}
015三数之和
代码(学习双指针)
class Solution {
public List> threeSum(int[] nums) {
if(nums.length<3){
return new ArrayList<>();
}
else{
// 排序,从小到达
Arrays.sort(nums);
if(nums[0]>0){
return new ArrayList<>();
}
// 创建整数链表的链表
List> lists=new ArrayList>();
// 遍历数组
for(int i=0;i0&&nums[i]!=nums[i-1]){
// 双指针
int p=i+1,q=nums.length-1;
// 求两数之和,亦为差值
int sum=0-nums[i];
// 寻找两数之和为sum的两个数
while(p



