/**
* 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
* 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
* */
public int[] towSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(target - nums[i])) {
return new int[]{i, map.get(target - nums[i])};
} else {
map.put(nums[i], i);
}
}
throw new IllegalArgumentException("不存在这样的两个数");
}
/**
* 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。
* 将两数相加返回一个新的链表。
* 你可以假设除了数字 0 之外,这两个数字都不会以零开头。
* 示例:
* 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
* 输出:7 -> 0 -> 8
* 原因:342 + 465 = 807
*/
public ListNode addTowNums(ListNode l1, ListNode l2) {
ListNode rs = new ListNode(0);
ListNode p = l1, q = l2, cur = rs.next;
int carry = 0;
while (p != null || q != null) {
int x = p == null ? 0 : p.val;
int y = q == null ? 0 : q.val;
int sum = x + y + carry;
carry = sum / 10;
cur = new ListNode(sum % 10);
cur = cur.next;
p = p == null ? null : p.next;
q = q == null ? null : q.next;
}
if (carry > 0) {
cur = new ListNode(carry);
}
return rs.next;
}
/**
* 给定一个字符串,找出不含有重复字符的最长子串的长度。
*
* 示例:
*
* 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3。
*
* 给定 "bbbbb" ,最长的子串就是 "b" ,长度是1。
*
* 给定 "pwwkew" ,最长子串是 "wke" ,长度是3。请注意答案必须是一个子串,"pwke" 是 子序列 而不是子串。
*/
public int lengthOfLongestSubstring(String s) {
int n = s.length();
Set<Character> set = new HashSet<>();
int ans = 0, i = 0, j = 0;
while (i < n && j < n) {
if (!set.contains(s.charAt(j))){
set.add(s.charAt(j++));
ans = Math.max(ans, j - i);
}
else {
set.remove(s.charAt(i++));
}
}
return ans;
}