注:所有的题目都是第一次进行刷题,没有进行优化,随后参考大神的代码进行优化
**题目一描述:**两数相加
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
题目链接 两数字相加题目
题目一分析:
一次进行位置相加,将和与进位计算出来,并创建新的链表添加在返回链表的末尾。
代码如下:
import java.util.Stack;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1==null)return l2;
if(l2==null) return l1;
//两个指针指向不同的链表
ListNode cur1 = l1;
ListNode cur2 = l2;
ListNode res = new ListNode(-1);//定义一个新的链表用于返回
ListNode curr = res;
int carry = 0;
//链表1和链表2同时进行加法,计算进位以及当前位置的元素
while(cur1!=null&&cur2!=null){
int sum = cur1.val+cur2.val+carry;
int value = sum%10;
carry = sum /10;
ListNode innode = new ListNode(value);
curr.next = innode;
curr = curr.next;
cur1 = cur1.next;
cur2 = cur2.next;
}
//链表1长,即数字1的位数较多
while(cur1!=null){
int sum = cur1.val+carry;
int value = sum%10;
carry = sum /10;
ListNode innode = new ListNode(value);
curr.next = innode;
curr = curr.next;
cur1 = cur1.next;
}
//链表2长,即数字2的位数较多
while(cur2!=null){
int sum = cur2.val+carry;
int value = sum%10;
carry = sum /10;
ListNode innode = new ListNode(value);
curr.next = innode;
curr = curr.next;
cur2 = cur2.next;
}
//两个链表相等,还有进位的位数进行处理
while(cur1==null&&cur2==null&&carry!=0){
int sum = carry;
int value = sum%10;
carry = sum /10;
ListNode innode = new ListNode(value);
curr.next = innode;
curr = curr.next;
}
return res.next;
}
}
题目二描述:
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
题目链接无重复字符的最长子串
题目二分析:
代码如下:
class Solution {
public int lengthOfLongestSubstring(String s) {
if(s==null||s.equals(""))return 0;
if(s.length() == 1)return 1;
//定义两个指针一个是当前子串的起始位置,一个是当前的字符
int index = 0;
int move = index+1;
int len = 0;//用来记录循环过程中最长子串的长度
//定义循环
for(;move < s.length();){
String sub = s.substring(index,move);
//如果该字符不是最后一个字符并且该字符在子串中没出现,当前的位置后移
while(move < s.length()&&!sub.contains(String.valueOf(s.charAt(move)))){
move++;
sub = s.substring(index,move);
}
//当前子串走到最后一个位置,返回最长的子串
if(move == s.length()-1)
{
len = sub.length()>len?sub.length():len;
return len;
}
//如果碰到了相同的字符,index向后移动一次,优化时可是使其加速前进,而不是每次只走一个位置,应该走到子串中当前字符出现的下一个位置
len = sub.length()>len?sub.length():len;
index++;
}
return len;
}
}
题目三描述:
将一个字符串转换成对应的整数,转换的规则如下:
1.如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。
2.假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
3.该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。
如果字符串无效时,返回为0,当整数转换过程超过了整数的范围,返回边界值。
题目链接:字符串转换整数
题目三分析:
首先找到第一个不为空的字符,如果第一个不为空的字符串不是‘+’或者‘-’或者数字字符那么一定返回0;如果第一个不为空的字符串是‘+’或者‘-’那么第二个字符必须是数字,否则返回0;如果第一个不为空的字符串是数字,那么对数字字符进行append最后转换成整型,对于超出范围的数字进行异常处理。
代码如下:
class Solution {
public int myAtoi(String str) {
if(str.equals("")||str.length()==0){
return 0;
}
int index = 0 ;
//给当前的字符串去除空头例如:" 123"
for(;index<str.length();){
if(str.charAt(index)==' ')index++;
else break;
}
//判断是不是当前的字符串只是由空字符组成或者当前字符不是数字字符或者正负号字符
if(index == str.length() || (str.charAt(index)!='+'&&str.charAt(index)!='-'&&!(str.charAt(index)>='0'&&str.charAt(index)<='9'))){
return 0;
}
//定义一个可变的字符串序列
StringBuilder sb = new StringBuilder();
//如果是正负号时。第二个字符只能是数字
if(str.charAt(index) == '+'||str.charAt(index) == '-'){
sb.append(str.charAt(index));
index++;
if(index==str.length()||!(str.charAt(index)>='0'&&str.charAt(index)<='9')) return 0;
while(index<str.length()&&(str.charAt(index)>='0'&&str.charAt(index)<='9')){
sb.append(str.charAt(index));
index++;
}
//转换数字异常处理,当前的数字超出了整数的范围
try{
int res = Integer.parseInt(sb.toString());
return res;
}catch(Exception ex){
if(sb.charAt(0)=='+')
return Integer.MAX_VALUE;
else return Integer.MIN_VALUE;
}
}else{
//最开始的位置是数字
while(index<str.length()&&(str.charAt(index)>='0'&&str.charAt(index)<='9')){
sb.append(str.charAt(index));
index++;
}
try{
int res = Integer.parseInt(sb.toString());
return res;
}catch(Exception ex){
return Integer.MAX_VALUE;
}
}
}
}