1:两数之和
题目:
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
代码解答:
class Solution {
public int[] twoSum(int[] nums, int target) { //引入数组和结果对象
int n=nums.length;//获取数组的长度
for(int i=0;i<n;i++){ //第一个数的索引下标,从它本身开始和它的下一个数匹配,
// 因为不能包含本身,所以该数的索引范围为【0,lenth-1】
for(int j=i+1;j<n;j++){ //第二个数从依次类推,+1是因为其本身为上一个数的索引的下一位开始
if( nums[i]+nums[j]==target){ //确认两个数的索引对应的数值的和是否和目标target相等
return new int[]{i, j};//输出
} }}
return new int[0]; //返回}}
2:两数相加
题目:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
代码解答:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode();//创建一个虚拟链表用于存放结果链表
ListNode curr = dummy;//虚拟链表
int carry = 0;//进位为0
while (l1 != null || l2 != null) {
int x = l1 == null ? 0 : l1.val;//如果l1链表为0则为0,否则令x为当前l1链表位置上的具体数值
int y = l2 == null ? 0 : l2.val;//同理
int total = x + y + carry;//何为两个链表上的对应位置上的数相加再加上上一个传递下来的进位
curr.next = new ListNode(total % 10);//求余,放在当前位置的下一链位
curr = curr.next;
carry = total / 10;//求商,作为进位供下一使用
if (l1 != null) l1 = l1.next;//如果链表不为null,继续向下推进
if (l2 != null) l2 = l2.next;//同理
}
if (carry != 0) curr.next = new ListNode(carry);
return dummy.next;//返回所创建虚拟链表的下一位开始的链表
}
}
3:无重复字符串的最大值
题目:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
代码解答:
/*
*designed by xiaoxiong
at Aug 11 2022
*/
class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length();//获取字符串总长度
int ans = 0;//初始化结果0
Set<Character> set = new HashSet<>();//运用hash哈希存放
int left = 0, right = 0;//初始化左右索引
while(right<n){
//back the mark charstr,索引范围为【0,char.length-1】
if(!set.contains(s.charAt(right))){ //只要没有碰到重复的,就往set里面放
//判断截取的字符串的右侧是否包含在左面滑动过的!
set.add(s.charAt(right));//不包含,在已截取的字符串的长度加上该字符
right++;
} else { //若包含,即碰到重复的,计算一下这次最长的结果,窗口后滑
ans = Math.max(ans, right - left);
set.remove(s.charAt(left));//clearthecharbetweentheleftandright
left++;
}
}
ans = Math.max(ans, set.size()); //从左到右没有重复字符或者最后一段字符串长度最大
return ans;
}
}
ps:为了美观随便放一张今天刷题的图了!