LeetCodeブラシ記録帳
2つの数値の合計
難易度:シンプル
説明:整数配列numsとターゲット値targetを指定して、合計が配列内のターゲット値である2つの整数を見つけて、それらの配列インデックスを返します。
各入力は1つの回答にのみ対応すると想定できます。ただし、配列内の同じ要素を2回使用することはできません。
例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
問題解決のアイデア
質問の前提条件は、各入力が1つの回答にのみ対応することですが、配列内の同じ要素は両側で使用できないため、配列をループして、配列要素の値をキーとして使用し、座標を値として使用できることがわかります。地図に。
ループトラバーサル中に、現在の要素とターゲットの値を減算して、差を取得します。次に、マップに移動して補間を取得します。取得できる場合は、返された配列に2つの座標を格納して戻ります。
実装コード
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] returnIntArray = new int[2];
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
int result = target - num;
if (map.containsKey(result)) {
returnIntArray[1] = i;
returnIntArray[0] = map.get(result);
} else {
map.put(num, i);
}
}
return returnIntArray;
}
}
2つの数値を加算
難易度:中程度
説明:2つの空でないリンクリストを指定して、2つの負でない整数を表します。それらの中で、それらのそれぞれの数字は逆の順序で保存され、それらの各ノードは1つの数字しか保存できません。
これら2つの数値を加算すると、それらの合計を表す新しいリンクリストが返されます。
数字の0を除いて、これらの数字のどちらも0で始まらないと想定できます。
例
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
問題解決のアイデア
私の最初の考えについて話させてください
2つの単一の項目リストをトラバースし、それをintに変換してから、2つのint(sumと呼ばれる)を追加し、最後にこの合計を文字列に変換してから、この文字列をトラバースし、その各値をListNodeに格納します、その後、単一のアイテムリストにアセンブルされます。ただし、実際の実行中のテストでは、leetCodeが送信されるときに、長い単一の項目リストがパラメーターとして渡されると、intの長さが直接オーバーフローして、誤った結果になることがあります。リストノードの長さの要件は指定できないため、ロングに変更されても削除される可能性があるため、このスキームは信頼できません
新しい計画
0、ノードヘッドを定義し、次に終了、ヘッドへのエンドポイントを定義、キャリー数量キャリーを定義
1.トラバースが完了しても両方が空の場合、2つの単一項目リスト(以下、l1、l2と呼ぶ)を判断しますが、1つが空でない限り、トラバースを続行しますが、2つのノードのvalは常に0ですあまりにも。
2. l1 + l2の値を取得します
3.最後の計算の結果は10を超える可能性があるため、キャリーになるため、これら2つの計算結果の最終的なロジックは次のようになります。l1+ l2 +キャリー
4.新しいキャリーは(l1 + l2 +キャリー)/ 10で、現在の合計結果は(l1 + l2 +キャリー)%10です。
5. end.nextを新しく作成したノードにポイントし、ノードのvalをsumに設定します
6.終了ポインタを新しく作成されたノードにポイントします(end = end.next)
7. l1とl2が空かどうかを確認し、空でない場合は次のノードをポイントします。
8.トラバーサルが完了すると、最後のビットの結果が10を超える可能性があるため、最終キャリーが0より大きいかどうかを判断する必要があります。0より大きい場合は、次のノードを終了して、新しいノード、ノード値を指す必要があります。キャリーです
9.作成したヘッドの値は0ですが、実際の結果では0ノードは必要ないため、結果をhead.nextとして返します。
実装コード
/**
* 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) {
ListNode head = new ListNode(0);
ListNode end = head;
int carry = 0;
while (l1 != null || l2 != null) {
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
int sum = x + y + carry;
// 判断和的结果是否大于10
carry = sum / 10;
// 获取无论结果是否大于10,最终的这一位的数字是多少
sum = sum % 10;
// 组装列表
end.next = new ListNode(sum);
end = end.next;
// 判断是否还需要继续next
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
// 判断最终位计算是否超过了10
if (carry > 0) {
end.next = new ListNode(carry);
}
return head.next;
}
}
繰り返される文字のない最長の部分文字列
難易度:中程度
説明:文字列を考えると、あなたが繰り返された文字が含まれていないかを調べる最長のサブストリングの長さを。
例
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3
問題解決のアイデア
- 文字と長さの位置を格納するマップを定義します。値の値は文字位置+ 1、+ 1は文字位置の後に繰り返されないことを意味します
- 繰り返さない部分文字列の開始位置の開始と終了を終了として定義する
- endが逆方向に移動し続けると、開始および終了間隔と同じ文字が表示されます。このとき、文字をキーとして使用し、その値を取得して開始を更新します。このとき、開始間隔と終了間隔に重複する文字はありません。
- startが更新されているかどうかに関係なく、マップデータ構造とansを更新します
- 時間の複雑さO(n)
実装コード
public int lengthOfLongestSubstring(String s) {
int ans = 0;
Map<Character, Integer> map = new HashMap<>();
for (int start = 0, end = 0; end < s.length(); end++) {
Character c = s.charAt(end);
if (map.containsKey(c)) {
start = Math.max(start, map.get(c));
}
ans = Math.max(ans, end - start + 1);
map.put(c, end + 1);
}
return ans;
}