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; } } }