LeetCode第一题:两数之和(Java)


前言

坚持下去便可胜利。只要心还在,梦想还在,我们还可以坚持直至胜利。没有过不去的坎,只有害怕的心。莫害怕,抓住希望便可突破困境找到方向!

随着对框架学习的不断深入以及项目经验的不断积累,愈发的意识到掌握基本算法逻辑的必要性,因此决定每天在LeetCode上面刷一道算法逻辑题并在此记录。


一、题目内容

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案

示例1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例2:

输入:nums = [3,2,4], target = 6
输出:[1,2]

示例3:

输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

代码模板:

class Solution {
    public int[] twoSum(int[] nums, int target) {

    }
}

二、解题过程

在看到题之后下意识的想到了利用暴力for循环来解决这道题,但是暴力for循环对于这道题来说虽然可以运行出正确的结果,但是对于时间复杂度来说就很慢,于是想到了利用哈希表来解决这道题。

1. 解题思路

题目的目的是寻找数组中和为target的两个元素,因此想到了可以在向哈希表中添加元素的同时进行遍历,即对哈希表边添加边遍历。(本题中哈希表的键和值均为Integer类型)

首先利用for循环对传来的数组进行遍历,在遍历的过程中向哈希表添加元素,向哈希表添加元素的方式为将数组的值作为哈希表的key(即哈希表的键),将数组当前元素的索引作为哈希表的value(即哈希表的值)。索引在遍历数组的for循环中增加一条判断:如果存在数值上等于target-数组中当前元素值的索引,就将该索引对应的value取出(即将数组中该元素对应的下标取出),此时将获取到的value与当前遍历到的数组元素的下标同时放到一个整型数组中并返回。

2. 解题代码

代码如下(示例):

class Solution {
    public int[] twoSum(int[] nums, int target) {
		// 创建出哈希表用来存储数据
		// 在存储时将哈希表的键与值相反存储,key的位置存储元素的值,value的位置存储索引
		Map<Integer, Integer> hashMap = new HashMap<>();
		// 在循环的过程中边遍历边存储
		for (int i = 0; i < nums.length; i++) {
			// 如果哈希表的键值中存在键值等于target - 数组中第i个值的数据,则获取该key对应的value
			// 此时获取到的value为传入数组中的下标
			if (hashMap.containsKey(target - nums[i])) {
				return new int[] {hashMap.get(target - nums[i]),i};
			}
			// 第一个数据中没有匹配的,将数组中元素的值保存为key,元素的索引保存为value
			hashMap.put(nums[i], i);
		}
		// 不会执行到这一步,如果执行到这一步说明数组中不存在相加等于target的两个元素
		return new int[0];
	}
}

三、提交结果

在这里插入图片描述


总结

以上便是力扣第一题两数之和不是用暴力for循环的解题思路,使用哈希表以空间来换时间的方式提高查询的效率。第一道题相对简单,希望自己能够坚持下去,愈挫愈勇!

所谓出路,就是走出去才会有路。人之所以能,是相信自己能。一个人最大的破产是绝望,最大的资产是希望。机会面前人人平等,但机会并不平均分配。创造机会的是勇者,等待机会的是常人,放弃机会的是蠢人。人生最大的遗憾不是过错,而是错过,有的机会一旦错过,便再也不可能出现!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: 这道是一道字符串处理。给定一个字符串 s,它的所有的字符都是小写的英文字母。要求把这个字符串变成一个按照字典序排序的字符串,并且要求在变换过程中只能在原来的字符串中交换两个相邻的字符。 解思路: - 从前往后扫描字符串 s,找到第一个不满足字典序的字符,记为字符 x。 - 从 x 往后扫描,找到最后一个比 x 大的字符 y,将 x 与 y 交换。 - 将 x 后面的字符串倒序排列,这样就得到了字典序更大的字符串。 下面是 Java 代码的实现: ``` class Solution { public String nextPermutation(String s) { char[] chars = s.toCharArray(); // 从后往前找到第一个不满足字典序的字符 x int i = chars.length - 2; while (i >= 0 && chars[i] >= chars[i + 1]) { i--; } // 如果 i < 0,说明原来的字符串已经是字典序最大的字符串,直接返回倒序排列的字符串 if (i < 0) { reverse(chars, 0, chars.length - 1); return new String(chars); } // 从 x 往后扫描,找到最后一个比 x 大的字符 y int j = chars.length - 1; while (j > i && chars[j] <= chars[i]) { j--; } // 将 x 与 y 交换 swap(chars, i ### 回答2: 目:LeetCode第38:报数 目描述: 给定一个正整数n,输出报数序列前n个数。 报数规则:从1开始报数,数到3的倍数时报Fizz,数到5的倍数时报Buzz,数到同时是3和5的倍数时报FizzBuzz,其他情况下则直接报数。 解思路: 使用循环遍历1到n的所有数字,按照报数规则进行判断并输出。 具体步骤如下: 1. 创建一个StringBuilder对象res,用于存储报数序列。 2. 使用for循环从1遍历到n。 3. 判断当前数字是否同时是3和5的倍数,如果是,则将"FizzBuzz"添加到res中。 4. 判断当前数字是否是3的倍数,如果是,则将"Fizz"添加到res中。 5. 判断当前数字是否是5的倍数,如果是,则将"Buzz"添加到res中。 6. 如果以上条件都不满足,则将当前数字转换为字符串并添加到res中。 7. 循环结束后,将res转换为字符串并返回。 Java代码如下: ```java public String countAndSay(int n) { StringBuilder res = new StringBuilder(); for (int i = 1; i <= n; i++) { if (i % 3 == 0 && i % 5 == 0) { res.append("FizzBuzz"); } else if (i % 3 == 0) { res.append("Fizz"); } else if (i % 5 == 0) { res.append("Buzz"); } else { res.append(Integer.toString(i)); } } return res.toString(); } ``` 以上代码可以将1到n的报数序列输出,并按照目要求进行相应转换。 ### 回答3: 目要求是根据给定的正整数 n,返回一个字符串,该字符串包含从 1 到 n 的所有数字对应的字符串,并且满足以下条件: 1. 如果数字能被 3 整除,则使用字母 "Fizz" 替代该数字。 2. 如果数字能被 5 整除,则使用字母 "Buzz" 替代该数字。 3. 如果数字能同时被 3 和 5 整除,则使用字母 "FizzBuzz" 替代该数字。 解思路: 利用循环遍历从 1 到 n 的所有数字,使用条件语句判断每个数字是否满足以上三个条件,然后根据条件替换数字并存入结果字符串中,最后返回结果。 Java代码如下: ```java class Solution { public String fizzBuzz(int n) { StringBuilder result = new StringBuilder(); for (int i = 1; i <= n; i++) { if (i % 3 == 0 && i % 5 == 0) { result.append("FizzBuzz"); } else if (i % 3 == 0) { result.append("Fizz"); } else if (i % 5 == 0) { result.append("Buzz"); } else { result.append(i); } if (i != n) { result.append(" "); } } return result.toString(); } } ``` 这段代码使用StringBuilder来构建结果字符串,判断每个数字是否满足条件,并根据条件拼接对应的字符串,每个数字之间用空格隔开。最后将StringBuilder转换成String并返回。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dream_飞翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值