LeetCode(1-2つの数値の合計&& 2-2つの数値の加算&& 3-2文字が繰り返されていない最長の部分文字列)

最初のように習慣を身につけてから見てください!!!

1-2つの数値の合計

タイトル説明:

整数配列numsと整数ターゲット値targetが与えられた場合、合計が配列内のターゲット値である2つの整数を見つけて、それらの配列添え字を返します。
各入力は1つの回答にのみ対応すると想定できます。ただし、配列内の同じ要素を2回使用することはできません。
回答は任意の順序で返すことができます。
例1:
入力:nums = [2,7,11,15]、ターゲット= 9
出力:[0,1]
説明:nums [0] + nums [1] == 9であるため、[0、1]を返します。
例2:
入力:nums = [3,2,4]、ターゲット= 6
出力:[1,2]
例3:
入力:nums = [3,3]、ターゲット= 6
出力:[0,1]

問題解決のアイデア:

主にマップのデータ型を使用して格納します。これは主に、マップがキーに従って直接値を取得できるため、後で配列の添え字を取得するプロセスがより便利になるためです。
ここに画像の説明を挿入
最初に、配列のすべての要素とその添え字を格納します。ループの過程でマップに含まれているかどうかを直接確認できます。含まれて差值的keyいる場合は直接戻ることができます。含まれていない場合は、ループ検出を続行します。

ただし、この場合、配列要素がターゲット半值直接返回两次ある場合、次のような特殊なケースを考慮する必要があります。たとえば、配列要素の添え字が添え字なることは明らかです

target = 6、num [] = {3,2,4}
すると、明らかに返される結果は{0,0}になるので、この状況を個別に把握する必要があります。これは最初です。要素を格納するときは、次のことが必要です。判断するのは是先判断是否有该元素再putマップ同样的key表示されると直接覆盖ドロップするため、最初に判断する必要があります。

これは私が下で丸で囲んだ部分です:
ここに画像の説明を挿入
ソースコード:

class Solution {
    
    
   public static int[] twoSum(int[] nums, int target) {
    
    
		int []num=new int[2];
		Map<Integer, Integer>map=new HashMap<Integer, Integer>();
		for(int i=0;i<nums.length;i++) {
    
    
			if(map.containsKey(nums[i])) {
    
    
				if(target%2==0&&target/2==nums[i]) {
    
    
					num[0]=map.get(nums[i]);
					num[1]=i;
					return num;
				}
			}
			map.put(nums[i],i);
		}
		for(int i=0;i<map.size();i++) {
    
    
			if(map.containsKey(nums[i])&&map.containsKey(target-nums[i])&&target/2!=nums[i])
			{
    
    
				num[0]=map.get(nums[i]);
				num[1]=map.get(target-nums[i]);
				return num;
			}
		}
		return num;
	}
}

2-2つの数字を追加します

タイトル説明:

2つの非負の整数を表す、2つの空でないリンクリストを提供します。各桁は逆の順序で格納され、各ノードは1桁しか格納できません。
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]

問題解決のアイデア:

この質問の本質は、足し算と引き算を文字列の形で実装することです。ここでは、例を次の図に変換して、誰もが理解できるようにします。
ここに画像の説明を挿入
一般的な考え方が得られたら、いくつかの詳細を残します。

まず第一に、nullポインタの例外を防ぐことです。次の点に注意する必要があります。

  • l1或l2为null将来的には、それらのval値を取得すると、nullポインター例外が発生し、判断が必要になります
  • l1ノードとl2ノードが逆方向最后会出现l1或l2的next节点已经为空移動する場合、実行を継続l1=l1.nextする空指针例外が発生し、判断が必要になります

第二は、私たちの最も注目がループ状態の終わりになるでしょうが、私はあなたがここに考えることができますが、つまり午前l1!=null||l2!=nullの手段という長いリストがあるとして没有结束、その後、逐位相加我々が必要もちろん继续执行、これは正しいですが、我々はノートを持っていますそれはおそらく私位数已经结束たちのものですが最后一位逐位相加之后向前产生了进位まだ私たちのものがあるので、明らかにこのキャリーに別のビットを追加する必要があります。次の例のように:
[1]、[9,9]
次に、最終結果が次のようになることは明らかです。 [0,0,1]、明らかに最後の桁の1つ、つまり最後のキャリーが残っているので、ループ終了条件は、ノードが空でなく、キャリーがある限り、次のwhile(l1!=null||l2!=null||flag)こと意味する必要があります。以下の操作を継続して実行します。

ソースコード:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    
    
  public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    
    
		boolean flag=false;
	      StringBuffer str1=new StringBuffer();
	      while(l1!=null||l2!=null||flag) {
    
    
	    	  int result=0;
	    	  //为了防止出现l1或l2出现null,出现空指针异常
	    	  if(l1==null&&l2!=null)
	    		  result+=l2.val;
	    	  else if(l1!=null&&l2==null)
	    		  result+=l1.val;
	    	  else if(l1!=null&&l2!=null)
	    		  result=l1.val+l2.val;
	          //通过flag来判断是否需要进位
	    	  if(flag)
	    		  result+=1;
	    	  str1.append(result%10);
	    	  //判断当前的位数和是否需要向前进位
	    	  if(result>=10)
	    		  flag=true;
	    	  else 
				flag=false;
        	   if(l1!=null&&l1.next!=null){
    
    
                  l1=l1.next;
                  }else{
    
    
                  l1=null;
                  }
  		      if(l2!=null&&l2.next!=null){
    
    
                l2=l2.next;
                }else{
    
    
                l2=null;
                } 	  
	      }
	      //新建各个节点信息
	      ListNode []listNodes=new ListNode[str1.length()];
          	      for(int i=0;i<listNodes.length;i++) {
    
    
               listNodes[i]=new ListNode(Integer.parseInt(""+str1.charAt(i)));
	      }
	      //将各节点串起来
	      for(int i=0;i<listNodes.length-1;i++) {
    
    
              listNodes[i].next=listNodes[i+1];
	      }
	      return listNodes[0];
	  }   
}

3-繰り返し文字のない最長の部分文字列

タイトル説明:

文字列を指定して、繰り返し文字を含まない最長の部分文字列の長さを調べてください。
例1:
入力:s = "abcabcbb"
出力:3
説明:文字が繰り返されていない最長の部分文字列は "abc"であるため、その長さは3です。
例2:
入力:s = "bbbbb"
出力:1
説明:文字が繰り返されていない最長の部分文字列は "b"であるため、その長さは1です。
例3:
入力:s = "pwwkew"
出力:3
説明:文字が繰り返されていない最長の部分文字列は "wke"であるため、その長さは3です。
答えは部分文字列の長さでなければならないことに注意してください。「pwke」は部分文字列ではなく部分列です。
例4:
入力:s = ""
出力:0

問題解決のアイデア:
ここでは、リストのデータ構造を使用して問題を解決することを選択します。
今回は、主に、各ループを通じて要素リストにすでに存在するかどうか判断します。要素がすでに存在する場合は、ループからジャンプします。そうでない場合は、リストに要素を追加し、同時に長さを判断します。長さが定義された長さよりも大きい限り、リストの長さを長さに割り当てます。必要なのはあなただけです。長さを返します。

ソースコード:

class Solution {
    
    
    public int lengthOfLongestSubstring(String s) {
    
    
		int length=0;
		for(int i=0;i<s.length();i++) {
    
    
		//新建一个空的List
		List<Character>list=new ArrayList<Character>();
		for(int j=i;j<s.length();j++) {
    
    
		    //判断是否已经有了重复的元素
			if(list.contains(s.charAt(j)))
			    // 如果有就跳出循环
				break;
		    //没有重复的元素
			else {
    
    
			    //添加该元素,同时判断长度大小
				list.add(s.charAt(j));
				if(list.size()>=length)
					length=list.size();
			}	
		}
		}
		return length;
    }
}

独創性は簡単ではありません、コードワードは簡単ではありません!!!
あなたがそれがあなたに役立つと思うなら、あなたは私の公式アカウントに従うことができます、新人UPはあなたのサポートを必要とします!!!
ここに画像の説明を挿入
見ないでください、あなたもかっこいいです!!

見続けてください、あなたはよく見えます!

おすすめ

転載: blog.csdn.net/lovely__RR/article/details/111950230