题目一:

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

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

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

分析:这是一个求数组和的题目,数组求和问题。

方法一:暴力法

1、我们设置两层循环遍历数组,找出数组所有的两数之和可能,将其相加找到目标值

2、将找得到值得索引下标返回,return new int[] {i,j};

3、如果没有所求值,则抛出一个异常,throw new IllegalAugementException("No sum");

class Solution {
public int[] twoSum(int[] nums, int target) { for(int i=0;i<nums.length;i++)
for(int j=i+1;j<nums.length;j++)
{
if(nums[i]+nums[j]==target)
{
return new int[] {i,j};
}
} throw new IllegalArgumentException("No sum");
}
}

方法二:哈希表法

1、首先将数组的元素和下标存放在一个哈希表中,因为我们要返回的是下标。

哈希表定义:Map<Interger,Interger> map=new HashMap<>();

循环存储数组元素:for(int i=0;i<nums.lengh,i++)  map.put(nums[i],i);

2、循环进行目标值计算,这一步最重要的是设置变量存储要求得值 int com=targer-nums[i]

3、进行判断,if(map.containKey(com)&&map.get(com)!=i),然后将其返回 return new int[] {i,map.get(com)};

4、抛出异常 throw new IllegalAugementException("No sum");

整体代码:

class Solution {
public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map=new HashMap(); for(int i=0;i<nums.length;i++)
{
map.put(nums[i], i);
} for(int i=0;i<nums.length;i++)
{
int com=target-nums[i];
if(map.containsKey(com)&& map.get(com)!=i)
{
return new int[] {i,map.get(com)};
}
} throw new IllegalArgumentException("No sum");
}
}

方法三、一次遍历哈希表

其实遍历和哈希表存储可以循环一次进行,一边遍历,一边将元素插入到哈希表,具体代码如下:

class Solution {
public int[] twoSum(int[] nums, int target) { Map<Integer,Integer> map=new HashMap();
for(int i=0;i<nums.length;i++)
{
int com=target-nums[i];
if(map.containsKey(com))
{
return new int[] {i,map.get(com)};
}
map.put(nums[i], i)
} throw new IllegalArgumentException("No sum");
}
}

题目二:

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:输入: 121输出: true

分析:判断回文将整数反转,然后判断反转后的整数和之前的整数是否相同。

1、如果整数小于0或者其余数等于0,则返回false,if(x<0||x%10==0) return false;

2、接下就是整数的反转,当x!=0,m=x%10; result=result*10+m;x=x/10;

完整代码:

class Solution {
public boolean isPalindrome(int x) { if(x<0||(x%10==0&&x!=0))
return false;
int s=x;
int result=0; while(x!=0)
{
int MeResult=x%10;
result=result*10+MeResult;
x=x/10;
}
if(s==result)
return true;
else {
return false;
}
}
}

题目三:

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

分析:这道题难点在于如何实现进位

1、遍历数组可以从最后一位开始,digit[digit.lenght]++;

2、对上式进行判断,如果其和等于10,选择进位,先将现在这一位赋值为0,将上一位加一;

3、遍历这样的一个循环;

4、如果相加之后小于10,直接返回digit;

5、上面可以实现大部分的测试用例,但对于9,99并不能通过,需要将数组长度加一,并将第一位设置为1,其他默认为0;

具体代码:

class Solution {
public int[] plusOne(int[] digits) {
for(int i=digits.length-1;i>=0;i--)
{
digits[i]++;
digits[i]=digits[i]%10;
if(digits[i]!=0)
return digits;
}
digits=new int[digits.length+1];
digits[0]=1;
return digits;
}
}

题目四:

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2

方法一:

1、设置两个指针,一个用于指向原始字符串,另一个指向匹配字符串;

2、如果字符值相同,i++,j++;

3、如果字符值不同,j=0,i=i-j+1,对其进行回溯;

4、最后如果j=a2.length,说明匹配成功,将其下标进行返回

5、否则返回-1; 

具体代码:

class Solution {
public int strStr(String haystack, String needle) { char[] a1=haystack.toCharArray();
char[] a2=needle.toCharArray(); int i=0,j=0; while(i<a1.length&&j<a2.length)
{
if(a1[i]==a2[j])
{
i++;
j++;
}
else {
i=i-j+1;
j=0;
}
} if(j==a2.length)
return i-j;
else {
return -1;
}
}
}

方法二:

public int strStr(String haystack, String needle) {
return haystack.indexOf(needle);
}

题目五:

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入: ["flower","flow","flight"]
输出: "fl"

方法一:

1、这是一道求解所有字符串的公共前缀,而不是子字符串;

2、先比较前两个字符串的公共前缀,得到前缀再与第三个字符串进行比较,逐步进行;

3、将数组第一个元素设置为前缀,prefix=strs[0];

4、循环接下来数组的其他元素,for(int i=1;i<strs.lenght;i++);

5、比较前两元素的公共前缀,while(strs[i].indexof(prefix)!=0),将前缀将前推一位,直到前缀是第一个字符串的子字符;

6、prefix=prefix.substring(0,prefix.lenght);

7、如果前缀为isempty(),return " ";

具体代码:

class Solution {
public String longestCommonPrefix(String[] strs) { if(strs.length==0) return "";
String prefix=strs[0]; for(int i=1;i<strs.length;i++)
{
while(strs[i].indexOf(prefix)!=0)
{
prefix=prefix.substring(0,prefix.length()-1);
if(prefix.isEmpty()) return "";
}
} return prefix;
}
}

题目六:

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。

方法一:

1、采用双指针,一个慢指针,一个快指针,快指针循环整个数组;

2、i=0;if(nums[i]!=nums[j]) i++;nums[i]=nums[j];

具体代码:

class Solution {
public int removeDuplicates(int[] nums) { int i=0; for(int j=1;j<nums.length;j++)
{
if(nums[i]!=nums[j])
{
i++;
nums[i]=nums[j];
}
}
return i+1;
}
}

题目7:

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

方法1:迭代

1、两个链表的合并,链表是个很奇怪的,不需要设置链表长度,只需要设置一个节点,再设置一个节点指针,将指针指向节点;

2、对指针进行修改其实就是对这个链表进行修改,比较神奇;

3、遍历两个链表,不管遍历哪一个,pre.next=l1,就表示指针发生了变化,指针发生发变化也就是链表发生了变化;

4、最后判断链表是否为空,pre.next=l1==null?l2:l1;

5、返回节点的指针就是整个链表了;

具体代码:

class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode result=new ListNode(0);
ListNode rListNode;
rListNode=result; while(l1!=null&&l2!=null)
{
if(l1.val<=l2.val)
{
rListNode.next=l1;
l1=l1.next;
}
else
{
rListNode.next=l2;
l2=l2.next;
} rListNode=rListNode.next;
}
rListNode.next=l1==null?l2:l1;
return result.next;
}
}

方法二:递归

1、先找到递归出口,l1或l2=0;

2、递归实在太简单了;

class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1==null)
return l2;
else if (l2==null) {
return l1;
}
else if (l1.val<l2.val) {
l1.next=mergeTwoLists(l1.next, l2);
return l1;
}
else {
l2.next=mergeTwoLists(l1, l2.next);
return l2;
}
}
}

题目八:

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2

分析:

1、通过有序数组查找目标值,就应该想到用二分查找;

2、这是一种思维,具体二分查找的过程,先设定数组首位的索引值和末尾索引值,l=0,r=len,这个长度应该是数组长度加一;

3、进行判断mid=(left+right)/2,nums[mid]==target,这个判断过程比较巧妙;

4、if(nums[mid]<target),left=mid+1;否则,right=mid;因为mid可能包括了等于target的情况;

5、我们的目标是获取相同值的下标,对于返回left还是right会有所考虑,我们只需要设置循环while(left<right),这样一定是left=right的时候跳出循环,不管返回那个都一样;

6、在求中间索引mid时,可能存在整数溢出的问题,解决方法是mid=(left+right)>>>1,这样实现无符号右移,得到不溢出结果;

具体代码:

class Solution {
public int searchInsert(int[] nums, int target) { int len=nums.length;
if(len==0)
return 0;
int left=0,right=len; while(left<right)
{
int mid=left+right>>>1;
if(nums[mid]<target)
{
left=mid+1;
}
else {
right=mid;
}
} return left;
}
}

题目九:

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

方法:

1、这道题思路很奇怪,我们什么时候应舍弃,从下个节点开始遍历是问题的关键;

2、先定义求和sum=0,ans=nums[0];

3、遍历数组,只要sum>0,就将nums[i]加进去,如果sum<0,从新开始遍历sum=nums[i];

4、求ans和sum的最大值;

具体代码:

class Solution {
public int maxSubArray(int[] nums) { int ans=nums[0];
int sum=0; for(int i=0;i<nums.length;i++)
{
if(sum>0)
{
sum=sum+nums[i];
}
else {
sum=nums[i];
}
ans=Math.max(ans, sum);
}
return ans;
}
}

题目十:

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3

方法一:

1、将一个数组复制到另一个数组中;

2、复制好的数组进行排序;

如何复制数组? java中给定了一个系统函数:System.arraycopy(要复制的数组,从第几位,目标数组,从第几位,复制几位);

数组如何排序? java中Arrays.sort(要排序的数组);

具体代码:

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) { System.arraycopy(nums2, 0, nums1, m, n);
Arrays.sort(nums1);
}
}

方法二:

1、因为要返回num1,先将num1复制到一个数组num1_copy,System.arraycopy(nums1,0,num1_copy,0,m);

2、设置双指针分别从前到后遍历num1_copy和num2,i,j;为num1也设置一个指针p,用于往后推进;

3、while(i<m&&j<n) num1[p++]=(nums1_copy[i]<nums2[j]) ?nums1_copy[i++]:nums2[j++];

4、处理两个数组其中一个剩下的元素;

具体代码:

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) { int[] nums1_copy=new int[m];
System.arraycopy(nums1, 0, nums1_copy, 0, m); int i=0,j=0,p=0;
while(i<m&&j<n)
{
nums1[p++]=(nums1_copy[i]<nums2[j])? nums1_copy[i++]:nums2[j++];
} if(i<m)
System.arraycopy(nums1_copy, i, nums1, i+j, m+n-i-j);
if(j<m)
System.arraycopy(nums2, j, nums1, i+j, m+n-i-j);
}
}

方法三:

1、同样设置三个指针,但是不需要复制num1;

2、从后往前进行遍历,思想有点巧妙;

具体代码:

class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) { int p1=m-1;
int p2=n-1;
int p=m+n-1; while(p1>=0&&p2>=0)
{
nums1[p--]=(nums1[p1]<nums2[p2])?nums2[p2--]:nums1[p1--];
} System.arraycopy(nums2, 0, num1, 0, p2+1);
}
}

LeetCode简单题(一)的更多相关文章

  1. 这样leetcode简单题都更完了

    这样leetcode简单题都更完了,作为水题王的我开始要更新leetcode中等题和难题了,有些挖了很久的坑也将在在这个阶段一一揭晓,接下来的算法性更强,我就要开始分专题更新题目,而不是再以我的A题顺 ...

  2. leetcode简单题6

    今天的华师 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, fro ...

  3. Go: LeetCode简单题,简单做(sort.Search)

    前言 正值端午佳节,LeetCode也很懂.这两天都是简单题,早点做完去包粽子. 故事从一道简单题说起 第一个错误的版本 简单题 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最 ...

  4. LeetCode简单题(三)

    题目一: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股 ...

  5. LeetCode简单题(二)

    题目一: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的 ...

  6. LeetCode简单题汇总

      1.两个数之和 给出一个整数数组,请在数组中找出两个加起来等于目标值的数, 你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index ...

  7. Leetcode简单题

    # Title Solution Acceptance Difficulty Frequency     1 Two Sum       44.5% Easy     2 Add Two Number ...

  8. LeetCode简单题(四)

    题目一: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你 ...

  9. leetcode刷题--两数之和(简单)

    一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...

随机推荐

  1. CentOS7中Tomcat的安装和配置以及启动配置tomcat。启动过程中的易错点

    Tomcat运行需要设置JRE目录,全局变量配置,请参见: Linux下JDK的安装和配置   当然也可以直接修改Tomcat的配置文件,请自行度娘   1.下载并解压 请先去官网找到需要下载的tom ...

  2. C# Socket通信DEMO

    一.套接字(socket)概念 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本 ...

  3. 什么是buffer?

    Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的.且在 V8 堆外分配物理内存. Buffer 的大小在被创建时确定,且无法调整. Buffer 类在 Node.js 中是一个全 ...

  4. HDU 1237 简单计算器(栈+stringstream)

    提供几份代码,这题的输入可以用stringsteam处理,先处理乘除后处理加减,正常思路,但是后面统计加减法的时候,对栈的运用错了,我用的时候相当于给它多加了几个括号就错了. 正确的简单解法就是,加法 ...

  5. Spring Boot Json 之 Jackjson Fastjson

    Json 是目前互联网应用使用最为广泛的信息交换格式之一.Spring Boot 内置了 Jackson .Json 在应用中主要体现在以下功能: 序列化 反序列化 字段格式化 验证自动化 目前长用的 ...

  6. 如何利用wx.request进行post请求

    1,method 是  get  方式的时候,会将数据转换成 query string method 为 post 时,header为{"Content-Type": " ...

  7. 洛谷 P5018 对称二叉树(搜索)

    嗯... 题目链接:https://www.luogu.org/problem/P5018 其实这道题直接搜索就可以搜满分: 首先递归把每个点作为根节点的儿子的数量初始化出来,然后看这个节点作为根节点 ...

  8. mysql练习(增删改查)char、int使用

    (4)char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节:而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode ...

  9. Plastic Bottle Manufacturer Tips - Attention To Plastic Bottle Processing Technology

    In fact, the processing technology of plastic bottles is actually quite strict. In fact, regular man ...

  10. Spring Boot 使用 CXF 调用 WebService 服务

    上一张我们讲到 Spring Boot 开发 WebService 服务,本章研究基于 CXF 调用 WebService.另外本来想写一篇 xfire 作为 client 端来调用 webservi ...