力扣題庫刷題(隨時記錄)


1、給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,你不能重復利用這個數組中同樣的元素。

示例:

給定 nums = [2, 7, 11, 15], target = 9

因為 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

class Solution {
    public int[] twoSum(int[] nums, int target) {
        
        for (int i = 0; i < nums.length; i++) {
        for(int j=1+i;j<nums.length;j++)
        {
            if((nums[i]+nums[j])==target)
            {
                int t[]=new int[2];
                t[0]=i;
                t[1]=j;
                return t;            
            }
            
        }
        
    }
        return null;     
    }
}

 

2、

給出兩個 非空 的鏈表用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式存儲的,並且它們的每個節點只能存儲 一位 數字。

如果,我們將這兩個數相加起來,則會返回一個新的鏈表來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例:

輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
/**
 * 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 p=l1;
	        ListNode q=l2;
	        ListNode pp=l1;
	        ListNode qq=l2;
	 
	        	        
	        int p_number=1;
	        int q_number=1;
	        while(p.next!=null)
	        {
	        	p_number++;
	        	p=p.next;       	
	        }
	        while(q.next!=null)
	        {
	        	q_number++;
	        	q=q.next;       	
	        }
	        	        
	        if(p_number>=q_number)
	        {
	        	for(int i=0;i<(q_number);i++)
	        	{
	        		
	        		int m=l1.val+l2.val;
	        		l1.val=m;
	        		l1=l1.next;
	        		l2=l2.next;
	        		        		
	        	}
	        	l1=pp;
	        	for(int i=1;i<p_number;i++)
	        	{
	        		int m=l1.val/10;
	        		l1.next.val=m+l1.next.val;
	        		l1.val=l1.val%10;
	        		l1=l1.next;	        		
	        	}
	        	if(l1.val>=10)
	        	{
	        		int m=l1.val/10;
	        		l1.val=l1.val%10;
	        		l1.next=new ListNode(m);
	        	}
	        	return pp;
	        	
	        }
	        else {
	        	
	 	        	for(int i=0;i<(p_number);i++)
	 	        	{
	 	        		
	 	        		int m=l1.val+l2.val;
	 	        		l2.val=m;
	 	        		l1=l1.next;
	 	        		l2=l2.next;
	 	        		        		
	 	        	}
	 	        	l2=qq;
	 	        	for(int i=1;i<q_number;i++)
	 	        	{
	 	        		int m=l2.val/10;
	 	        		l2.next.val=m+l2.next.val;
	 	        		l2.val=l2.val%10;
	 	        		l2=l2.next;	        		
	 	        	}
	 	        	if(l2.val>=10)
	 	        	{
	 	        		int m=l2.val/10;
	 	        		l2.val=l2.val%10;
	 	        		l2.next=new ListNode(m);
	 	        	}
	 	        	return qq;
            }	        
    }
}

  

3、

給定一個字符串,請你找出其中不含有重復字符的 最長子串 的長度。

示例 1:

輸入: "abcabcbb"
輸出: 3 
解釋: 因為無重復字符的最長子串是 "abc",所以其長度為 3。

示例 2:

輸入: "bbbbb"
輸出: 1
解釋: 因為無重復字符的最長子串是 "b",所以其長度為 1。

示例 3:

輸入: "pwwkew"
輸出: 3
解釋: 因為無重復字符的最長子串是 "wke",所以其長度為 3。
     請注意,你的答案必須是 子串 的長度,"pwke" 是一個子序列,不是子串。
(1)暴力法
public int lengthOfLongestSubstring(String s) {
         if(s.equals(""))
		 {
			 return 0;
		 }
         char[] start=s.toCharArray();
	     char a;
		 int he=0;
		 int temp=0;
		 boolean k=true;
		 for(int i=0;i<s.length();i++)
		 {   
			  k=true;
			  for(int j=i+1;j<s.length();j++)
			    {
				  if(k==false)
				  {
					  break;
				  }
			    	a=start[j];
			    	he=0;
			    	for(int m=i;m<j;m++)
			    	{
			    		if(a!=start[m])
			    		{
			    			he++;
			    			if(temp<he)
			    			{
			    				temp=he;
			    			}
			    		}
			    		else 
			    		{
			    			k=false;
			    			break;
			    		}		    		
			    	}			    	 
			     }
		 }
		 	 
		 return temp+1;
        
    }   

  (2)滑動窗口方法

滑動窗口是數組/字符串問題中常用的抽象概念。 窗口通常是在數組/字符串中由開始和結束索引定義的一系列元素的集合,即 [i, j)(左閉,右開)。而滑動窗口是可以將兩個邊界向某一方向“滑動”的窗口。例如,我們將 [i, j)[i,j)向右滑動 11 個元素,則它將變為 [i+1, j+1)[i+1,j+1)(左閉,右開)。

class Solution {
    public int lengthOfLongestSubstring(String s) {
         Set<Character> set=new HashSet<>();
         int temp=0;
         int i=0; //滑動窗口[i,j)
         int j=0;
         int n=s.length();
         while(i<n&&j<n)
         {
             if(!set.contains(s.charAt(j)))
             {
                 set.add(s.charAt(j++));                    
                 temp=Math.max(temp, j-i);         
             }
             else 
             {
                 set.remove(s.charAt(i++));
             }
                          
         }
         return temp;
    }   
}

 

5.給定一個字符串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1:

輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。

示例 2:

輸入: "cbbd"
輸出: "bb"

解決方法:動態規划
class Solution {
    public String longestPalindrome(String s) {
        if(s.equals(""))
    {
        return "";
    }
    String temp=String.valueOf(s.charAt(0));
    //第一種
    for(int i=0;i<s.length();i++)
    {
         for(int j_min=i-1,j_max=i+1;j_min>=0&&j_max<s.length();j_min--,j_max++)
         {
             if(String.valueOf(s.charAt(j_min)).equals(String.valueOf(s.charAt(j_max))))
             {
                 if(temp.length()<(j_max-j_min+1))
                 {
                     temp=s.substring(j_min, j_max+1);
                 }
                
             } else break;
          }
        }
    //第二種
    for(int i=0,j=1;i<s.length()&&j<s.length();i++,j++)
    {
         for(int j_min=i,j_max=j;j_min>=0&&j_max<s.length();j_min--,j_max++)
         {
             if(String.valueOf(s.charAt(j_min)).equals(String.valueOf(s.charAt(j_max))))
             {
                 if(temp.length()<(j_max-j_min+1))
                 {
                     temp=s.substring(j_min, j_max+1);
                 }
                
             } else break;
          }
        }
              return temp;
        
    }
}

 

6.Z字形變換

將一個給定字符串根據給定的行數,以從上往下、從左到右進行 Z 字形排列。

比如輸入字符串為 "LEETCODEISHIRING" 行數為 3 時,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的輸出需要從左往右逐行讀取,產生出一個新的字符串,比如:"LCIRETOESIIGEDHN"

請你實現這個將字符串進行指定行數變換的函數:

string convert(string s, int numRows);

示例 1:

輸入: s = "LEETCODEISHIRING", numRows = 3
輸出: "LCIRETOESIIGEDHN"

示例 2:

輸入: s = "LEETCODEISHIRING", numRows = 4
輸出: "LDREOEIIECIHNTSG"
解釋:

L     D     R
E   O E   I I
E C   I H   N
T     S     G
class Solution {
    public String convert(String s, int numRows) {
        if(s.length()<=numRows)
        {
            return s;
        }
        
                
            String a[]=new  String[numRows];
         int m=0;
         for(int i=0;i<s.length()&&m<s.length();i++)
         {
             if(i<1) {
            for(int j=0;j<numRows;j++)
            {
                a[j]=""+s.charAt(m);                   
                m++;
            }
             }
             if(i>=1)
             {
                 for(int j=0;j<numRows&&m<s.length();j++)
                 {
                     a[j]=a[j]+s.charAt(m);                   
                     m++;
                 }
                 
             }
            for(int q=numRows-2;q>0&&m<s.length();q--)
            {
                a[q]=a[q]+s.charAt(m);
                m++;
            }         
         }
         
         
            for(int f=1;f<numRows;f++)
            {
                a[0]=a[0]+a[f];
            }    
            return a[0];
        
    }
}

 7.整數反轉

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。

示例 1:

輸入: 123
輸出: 321

 示例 2:

輸入: -123
輸出: -321

示例 3:

輸入: 120
輸出: 21
class Solution {
    public int reverse(int x) {
          boolean num=true;
         if(x==-2147483648)
          {
              return 0;
          }
          if(x<0)
          {
              //轉換成正數
              x=-x;
              num=false;
          }
      
          String a=String.valueOf(x);      
          char m[]=a.toCharArray();
          String b="";
          for(int i=m.length-1;i>=0;i--)
          {
              b=b+m[i];              
          }
          long tem=Long.parseLong(b);
          
          if(num==false&&tem>2147483648l)
          {
              return 0;
          }
          if(num==true&&tem>2147483647l)
          {
              return 0;
          }
          int temp=Integer.parseInt(b);
     
              if(num==true)
              {
                  return  temp;
              }
              else {
                  return -temp;
              }                  
    }
  
}  

 8.字符串轉換成整數

請你來實現一個 atoi 函數,使其能將字符串轉換成整數。

首先,該函數會根據需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。

當我們尋找到的第一個非空字符為正或者負號時,則將該符號與之后面盡可能多的連續數字組合起來,作為該整數的正負號;假如第一個非空字符是數字,則直接將其與之后連續的數字字符組合起來,形成整數。

該字符串除了有效的整數部分之后也可能會存在多余的字符,這些字符可以被忽略,它們對於函數不應該造成影響。

注意:假如該字符串中的第一個非空格字符不是一個有效整數字符、字符串為空或字符串僅包含空白字符時,則你的函數不需要進行轉換。

在任何情況下,若函數不能進行有效的轉換時,請返回 0。

說明:

假設我們的環境只能存儲 32 位大小的有符號整數,那么其數值范圍為 [−231,  231 − 1]。如果數值超過這個范圍,qing返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。

示例 1:

輸入: "42"
輸出: 42

示例 2:

輸入: "   -42"
輸出: -42
解釋: 第一個非空白字符為 '-', 它是一個負號。
     我們盡可能將負號與后面所有連續出現的數字組合起來,最后得到 -42 。

示例 3:

輸入: "4193 with words"
輸出: 4193
解釋: 轉換截止於數字 '3' ,因為它的下一個字符不為數字。

示例 4:

輸入: "words and 987"
輸出: 0
解釋: 第一個非空字符是 'w', 但它不是數字或正、負號。
     因此無法執行有效的轉換。

示例 5:

輸入: "-91283472332"
輸出: -2147483648
解釋: 數字 "-91283472332" 超過 32 位有符號整數范圍。 
     因此返回 INT_MIN (−231) 。
class Solution {
    public int myAtoi(String str) {
             String numb;
             long tem;
         for(int i=0;i<str.length();i++)
         {
             if(str.charAt(i)==' ')
             {
                 if(i==str.length()-1)
                 {
                     return 0;
                 }
                 continue;
             }
              if(str.charAt(i)!='-'&&str.charAt(i)!='+'&&((int)str.charAt(i)<=47||(int)str.charAt(i)>=58))
             {
                 return 0;
             }
             else
             {
                 //當第一個是-,當第一個是+,當地一個是直接是數字                 
                     if(str.charAt(i)=='-')
                     {
                         numb="-";
                         if(str.length()==1)
                         {
                             return 0;
                         }
                     }
                     if(str.charAt(i)=='+')
                     {
                         numb="+";
                         if(str.length()==1)
                         {
                             return 0;
                         }
                     }
                     else
                     {
                         numb=String.valueOf(str.charAt(i));
                     }
                     
                   
                                            
                     for(int j=i+1;j<str.length();j++)
                     {
                         if(str.charAt(j)>47&&str.charAt(j)<58)
                         {
                             numb=numb+str.charAt(j);
                         }
                         else 
                         {
                            if((j==i+1)&&(str.charAt(i)=='-'||str.charAt(i)=='+'))
                             {
                                 return 0;
                             }
                             else 
                             {
                                 break;
                             }
                         }
                     }
                     
                     //得到數字,判斷是否大於int最大值
                     try {
                     tem=Long.parseLong(numb);
                     }catch(Exception ex) 
                     {
                         if(numb.charAt(0)=='-')
                         {
                             return -2147483648;
                         }
                         else
                            {
                                return 2147483647;
                            }
                     }
                    if(tem<Integer.MIN_VALUE||tem>Integer.MAX_VALUE)
                    {
                        if(tem<Integer.MIN_VALUE)
                        {
                            return -2147483648;
                        }
                        else
                        {
                            return 2147483647;
                        }
                    }
                    else 
                    {
                        int temp=(int) tem;
                        return temp;
                    }                                  
             }
         }
        
         return 0; 
    }
}

 9.回文數

判斷一個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例 1:

輸入: 121
輸出: true

示例 2:

輸入: -121
輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個回文數。

示例 3:

輸入: 10
輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個回文數。
class Solution {
    public boolean isPalindrome(int x) {
        String tem=String.valueOf(x) ;
          String num="";
          for(int i=tem.length()-1;i>=0;i--)
          {
              num=num+tem.charAt(i);
          }
          if(tem.equals(num))
          {
              return true;
          }
          else
          {
              return false;
          }
          
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM