zoukankan      html  css  js  c++  java
  • 力扣题库刷题(随时记录)

    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;
              }
              
        }
    }
  • 相关阅读:
    Python基于正则表达式实现文件内容替换的方法
    python数据处理实战
    python数据处理实战
    Python命令行参数解析模块getopt使用实例
    Python命令行参数解析模块getopt使用实例
    python命令行参数解析OptionParser类用法实例
    vim中权限不足时不用退出而强制保存
    C++11 STL算法简介
    每天一个linux命令(6) ar命令
    mysql++ Query
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/10557556.html
Copyright © 2011-2022 走看看