LeetCode第1题
两数之和,用 java 实现,采用暴力法
class Solution {
public int[] twoSum(int[] nums, int target) {
int results[] = new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
results[0]=i;
results[1]=j;
return results;
}
}
}
return null;
}
}
LeetCode第2题
两数相加
/**
* 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 result=null; //用来存放结果
ListNode p=null; //用来指向result链表中的最后一个结点
int a=0; //用来记录两个数相加后进位多少
int temp=0; //用来记录两个数相加后存入result的值
while(l1!=null && l2!=null){
int sum = l1.val+l2.val+a;
a=0;
if(sum<10){
temp=sum;
}else{
a = sum / 10;
temp = sum % 10;
}
ListNode node=new ListNode(temp);
if(result!=null){
p.next=node;
p=p.next;
}else{
result=node;
p=result;
}
l1=l1.next;
l2=l2.next;
}
if(l1==null){
while(l2!=null){
int sum = l2.val+a;
a=0;
if(sum<10){
temp=sum;
}else{
a = sum / 10;
temp = sum % 10;
}
ListNode node=new ListNode(temp);
p.next=node;
p=p.next;
l2=l2.next;
}
}
if(l2==null){
while(l1!=null){
int sum = l1.val+a;
a=0;
if(sum<10){
temp=sum;
}else{
a = sum / 10;
temp = sum % 10;
}
ListNode node=new ListNode(temp);
p.next=node;
p=p.next;
l1=l1.next;
}
}
//此情况是刚好两个链表位数相同时,最后加完需要把进位连到后边
if(a!=0){
ListNode node=new ListNode(a);
p.next=node;
p=p.next;
}
return result;
}
}
LeetCode第3题
无重复字符的最长子串
class Solution {
public int lengthOfLongestSubstring(String s) {
int max=0;
List<Character> lists=new ArrayList<>();
for (int start=0;start<s.length();start++){
for (int i=start;i<s.length();i++){
if (!lists.contains(s.charAt(i))){
lists.add(s.charAt(i));
if (lists.size()>max){
max=lists.size();
System.out.println(lists.size());
}
}else {
lists.clear();
break;
}
}
}
return max;
}
}
LeetCode第4题
寻找两个正序数组的中位数
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int c[]=new int[nums1.length+nums2.length];
int loc=0;
int i=0,j=0;
while (i<nums1.length && j< nums2.length){
if (nums1[i]<=nums2[j]){
c[loc++]=nums1[i++];
}else {
c[loc++]=nums2[j++];
}
}
while (i<nums1.length){
c[loc++]=nums1[i++];
}
while (j<nums2.length){
c[loc++]=nums2[j++];
}
if (c.length%2==1){
return (double) c[c.length/2];
}else {
return (double) (c[c.length/2]+c[c.length/2-1])/2;
}
}
}
LeetCode第5题
求最长回文子串,动态规划
class Solution {
public String longestPalindrome(String s) {
int length=s.length();
String result="";
boolean[][] p=new boolean[length][length];
for (int len=1;len<=length;len++){
for (int start=0;start<=length-len;start++){
int end = start+len-1;
if (start==end){
p[start][start]=true;
}
if (start+1==end){
p[start][end]=s.charAt(start)==s.charAt(end);
}
if (start+1<end){
p[start][end]=s.charAt(start)==s.charAt(end) && p[start+1][end-1];
}
if (p[start][end]&& len>result.length()){
result=s.substring(start,end+1);
}
}
}
return result;
}
}
LeetCode第6题
Z 字形变换
class Solution {
public String convert(String s, int numRows) {
if (numRows==1)
return s;
int num[]=new int[s.length()];
int flag=1; //flag为正则是加,为负则是减
int xuhao=1;
//给每个字符标上行号
for (int i=0;i<s.length();i++){
if (flag==1){
num[i]=xuhao++;
}else {
num[i]=xuhao--;
}
if (xuhao==numRows){
flag=-1;
}
if (xuhao==1){
flag=1;
}
}
StringBuilder sb=new StringBuilder();
for (int i=1;i<=numRows;i++){
for (int j=0;j<s.length();j++){
if (num[j]==i){
sb.append(s.charAt(j));
}
}
}
return sb.toString();
}
}
LeetCode第7题
整数反转
方法一:拼接思想
class Solution {
public int reverse(int x) {
List<Integer> lists=new ArrayList<>();
boolean fu=false;
if(x==0){
return x;
}
if (x<0){
x=(-x);
fu=true;
}
int i=0;
while(x>=10){
i=x%10;
lists.add(i);
x=x/10;
}
lists.add(x);
StringBuilder sb=new StringBuilder();
boolean flag=false;
for (int j=0;j<lists.size();j++){
int value=lists.get(j);
if (value!=0){
flag=true;
}
if (flag){
sb.append(value);
}
}
long i1 = Long.parseLong(sb.toString());
if (fu){
i1=(-i1);
}
if (i1>Integer.MAX_VALUE||i1<Integer.MIN_VALUE){
i1=0;
}
return (int)i1;
}
}
方法二:计算思想(更优)
class Solution {
public int reverse(int x) {
long n = 0;
while(x != 0) {
n = n*10 + x%10;
x = x/10;
}
if (n>Integer.MAX_VALUE||n<Integer.MIN_VALUE){
return 0;
}else {
return (int)n;
}
}
}
LeetCode第8题
字符串转换整数
class Solution {
public int myAtoi(String str) {
str=str.trim();
boolean fu=false;
if("".equals(str)){
return 0;
}
char pre='z';
long n=0;
for (int i=0;i<str.length();i++){
char x=str.charAt(i);
if (x=='-'||x=='+'){
if (pre=='-'||pre=='+'){ //用来防止‘+-2这个坑爹例子’
return 0;
}
if (Character.isDigit(pre)){ //用来防止‘22-这个例子’
break;
}
pre=x;
continue;
}
if (Character.isDigit(x)){
if (pre=='-'){
fu=true;
}
n=(n*10+Long.parseLong(String.valueOf(x)));
if (n>Integer.MAX_VALUE){ //用来防止long越界
break;
}
}else {
break;
}
pre=x;
}
if (fu){
n=(-n);
}
if (n<Integer.MIN_VALUE){
return Integer.MIN_VALUE;
}
if (n>Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}
return (int)n;
}
}
LeetCode第9题
回文数
class Solution {
public boolean isPalindrome(int x) {
String s=x+"";
int p=0,q=s.length()-1;
while(p<=q){
if (s.charAt(p)==s.charAt(q)){
p++;
q--;
}else {
return false;
}
}
return true;
}
}
LeetCode第10题
正则匹配:利用动态规划
class Solution {
public boolean isMatch(String s, String p) {
boolean[][] dp = new boolean[s.length() + 1][p.length() + 1];
dp[0][0] = true;
for (int i=1;i<dp[0].length;i++){
char ch=p.charAt(i-1);
if (ch=='*'){
if (i==1){
dp[0][i]=true;
continue;
}
dp[0][i]=dp[0][i-2];
}
}
for (int row=1;row<dp.length;row++){
char ch=s.charAt(row-1);
for (int col=1;col<dp[row].length;col++){
char ch2=p.charAt(col-1);
if (ch2==ch||ch2=='.'){
dp[row][col]=dp[row-1][col-1];
}
else if (ch2=='*'){
if (col>1){
if (dp[row][col-2]){
dp[row][col]=true;
}else{
char pre=p.charAt(col-2);
if (pre==ch || pre=='.'){
dp[row][col]=dp[row-1][col];
}
}
}
}
}
}
return dp[s.length()][p.length()];
}
}
LeetCode第11题
盛最多水的容器
class Solution {
public int maxArea(int[] height) {
int max=0;
for (int i=0;i<height.length-1;i++){
for (int j=i+1;j<height.length;j++){
int width=j-i;
int high=Math.min(height[i],height[j]);
int area=width*high;
if (area>max){
max=area;
}
}
}
return max;
}
}
LeetCode第12题
整数转罗马数字(贪心算法)
class Solution {
public String intToRoman(int num) {
int[] value = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] flags = {"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
StringBuilder sb=new StringBuilder();
for (int i=0;i<value.length;i++){
while (num>=value[i]){
num-=value[i] ;
sb.append(flags[i]);
}
if (num<=0)
break;
}
return sb.toString();
}
}
LeetCode第13题
罗马数字转整数
class Solution {
public int romanToInt(String s) {
int result=0;
Map<Character,Integer> map=new HashMap<>();
map.put('I',1);map.put('V',5);map.put('X',10);
map.put('L',50);map.put('C',100);map.put('D',500);
map.put('M',1000);
for(int i=0;i<s.length();i++){
int value=map.get(s.charAt(i));
if (i+1<s.length() && value<map.get(s.charAt(i+1))){
value=(-value);
}
result+=value;
}
return result;
}
}
LeetCode第14题
最长公共前缀
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length==0){
return "";
}
//求出数组中长度最短的字符串长度
StringBuilder sb=new StringBuilder();
int min=Integer.MAX_VALUE;
for (int i=0;i<strs.length;i++){
if (strs[i].length()<min)
min=strs[i].length();
}
boolean flag =true;
out:
for (int i=0;i<min;i++){
char s=strs[0].charAt(i);
for (int j=1;j<strs.length;j++){
if (strs[j].charAt(i)!=s){
flag=false;
break out;
}
}
sb.append(s);
}
return sb.toString();
}
}
LeetCode第15题
三数之和
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList();
if(nums == null || nums.length < 3) return ans;
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if (nums[i]>0)//当i大于0时总和不可能为0
break;
if (i>0&&nums[i]==nums[i-1]) //当i和前一个相同时跳过
continue;
int L=i+1,R=nums.length-1;
while(L<R){
int sum=nums[i]+nums[L]+nums[R];
if (sum==0){
ans.add(Arrays.asList(nums[i],nums[L],nums[R]));
while (L<R && nums[L]==nums[L+1]){
L++;
}
while (L<R && nums[R]==nums[R-1]){
R--;
}
L++;
R--;
}else if (sum<0){
L++;
}else if (sum>0){
R--;
}
}
}
return ans;
}
}
LeetCode第16题
最接近的三数之和
class Solution {
public int threeSumClosest(int[] nums, int target) {
int dis=Integer.MAX_VALUE;
int result=0;
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
for(int i=0;i<nums.length-2;i++){
if (i>0&&nums[i]==nums[i-1]) //当i和前一个相同时跳过
continue;
for (int j=i+1;j<nums.length-1;j++){
if (j>i+1&&nums[j]==nums[j-1]){
continue;
}
for (int k=j+1;k<nums.length;k++){
int sum=nums[i]+nums[j]+nums[k];
int newdis=Math.abs(sum-target);
if (newdis<dis){
dis=newdis;
result=sum;
}
}
}
}
return result;
}
}
LeetCode第17题
电话号码的字母组合:无剪枝的回溯法
class Solution {
private List<String> result=new ArrayList<>();
private String[] map = {" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
private StringBuilder sb=new StringBuilder();
public List<String> letterCombinations(String digits) {
if (digits==null || digits.length()==0){
return new ArrayList<>();
}
traceback(digits,0);
return result;
}
public void traceback(String digits,int index){
if (index>digits.length()-1){
result.add(sb.toString());
return;
}
int x=Integer.parseInt(digits.charAt(index)+"");
String s=map[x];
for (int i=0;i<s.length();i++){
sb.append(s.charAt(i));
traceback(digits,index+1);
sb.deleteCharAt(sb.length()-1);
}
}
}
LeetCode第18题
四数之和
class Solution {
private List<List<Integer>> result=new ArrayList<>();
public List<List<Integer>> fourSum(int[] nums, int target) {
Arrays.sort(nums);
System.out.println(Arrays.toString(nums));
for(int i=0;i<nums.length-2;i++){
if (i>0&&nums[i]==nums[i-1])
continue;
for (int j=i+1;j<nums.length-1;j++){
if (j>i+1&&nums[j]==nums[j-1]){
continue;
}
for (int m=j+1;m<nums.length;m++){
if (m>j+1&&nums[m]==nums[m-1]){
continue;
}
for (int n=m+1;n<nums.length;n++){
if (n>m+1&&nums[n]==nums[n-1]){
continue;
}
if (nums[i]+nums[j]+nums[m]+nums[n]==target){
result.add(new ArrayList(Arrays.asList(nums[i], nums[j], nums[m], nums[n])));
}
}
}
}
}
return result;
}
}
LeetCode第19题
删除链表的倒数第N个节点,垃圾题目一个,链表不带头节点,sb让做题人自己猜呢?怕不是没脑子吧。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode MyLinkList=new ListNode(0);
MyLinkList.next=head;
ListNode p=MyLinkList;
ListNode q=MyLinkList;
for (int i=0;i<n;i++){
p=p.next;
}
while (p.next!=null){
p=p.next;
q=q.next;
}
q.next=q.next.next;
return MyLinkList.next;
}
}
LeetCode第20题
有效的括号
class Solution {
public boolean isValid(String s) {
Stack<Character> stack=new Stack<>();
for (int i=0;i<s.length();i++){
char c=s.charAt(i);
if (c=='[' ||c=='('||c=='{'){
stack.push(c);
}else{
if (stack.isEmpty()){
return false;
}
boolean flag=match(stack.pop(),c);
if (!flag){
return false;
}
}
}
return stack.isEmpty();
}
public boolean match(char a,char b){
if (a=='('&&b==')'){
return true;
}else if (a=='{'&&b=='}'){
return true;
}else return a == '[' && b == ']';
}
}