本人的编译器使用的是Visual Studio 2019,因此若有需要,当遇到scanf_s函数时,应该将其改成scanf。
1.两数之和
有人相爱,有人夜里看海,有人力扣第一道题做不出来
第九次提交终于过了
题目:
给定一个整数数组 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 <= 10^4
- -10^9 <= nums[i] <= 10^9
- -10^9 <= target <= 10^9
- 只会存在一个有效答案
进阶:你可以想出一个时间复杂度小于 O(n^2) 的算法吗?
思路:
编辑器和PTA的差了许多,力扣编辑器直接给定了一个函数,把题目给的数组 数组长度 目标都以参数形式输入
直接用两个for循环遍历比对是否等于target,参考了官方答案,才知道需要直接申请数组内存然后填入,最后以数组形式返回结果(我还以为是直接printf)
#include <stdio.h>
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int cnt=0,cnt2=0;
for (cnt = 0; cnt < numsSize;cnt++){ //cnt遍历
for (cnt2 = 0; cnt2 < numsSize;cnt2++){ //cnt2遍历
if (nums[cnt] + nums[cnt2] == target && cnt != cnt2){
printf("[%d,%d]", cnt, cnt2);
int *ret = malloc(sizeof(int) * 2);
ret[0] =cnt;
ret[1] =cnt2;
*returnSize =2;
return ret;
}
}
}
*returnSize = 0;
return NULL;
}
写完又看了一眼官方答案发现我这边出现了重复判断,也就是cnt每次加1,cnt2都重复的从nums[0]开始判断,所以出现了某个数自己与自己相加的出结果而导致最终检测答案不正确的情况。
其实很简单 不需要判断cnt != cnt2 只需要每次都从cnt+1的位置开始判断即可。
7.整数反转
我直接选做第二道简单难度题
题目:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0<br>输出:0
提示:
-2^31 <= x <= 2^31 - 1
思路:
由例3可知,要求反转之后数前的0不保留,遂正数部分可直接用循环处理得出每位数后运算相加来反转。而负数部分或许可以先拿掉负号,然后同上处理?
以下进行代码写入