力扣练习题
1.0 题目
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
2.0 实例
实例 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]
3.0题目分析
对于这个题目拿到手之后可以先想到用for循环,而需要两个数相加,可以利用循环嵌套来实现筛选数组的两个数。
而对于题目中所要求的同一个元素只能使用一次。我们可以设两个变量,i,j在第二个for循环中令j!=i。
对于题目中说可以按任意顺序返回,我们可以按照大小顺序输出。例如[0,1],[5,8],[1,4]这样。这时我们只需要利用三目运算符即可
4.0 程序
#include<stdio.h>
int main()
{
int n=8;
int nums[n]={2,3,4,5,4,3,6};
int target=7;
int i=0,j=0;
int k=1;
for(i=0;i<n&&k!=0;i++){
for(j=0;j!=i&&j<n;j++){
if(nums[i]+nums[j]==target){
printf("输出的为nms[%d]+nums[%d]\n",(i>j)?i ,j:j, i);
k=0;
break;
}
}
}
if(k){
printf("数组中没有两个元素使它成立");
}
return 0;
}
5.0 程序详细解释
-
对于定义变量,n我们可以设置一个大一点的数,或者自己定义多大的数组设置多大的,但是注意n设置的不能比数组里你给的元素数量小,小编在测试的时候因为没注意,多设置了几个变量,但是没有改n的值,导致运行的时候显示下面这行字符。
terminate called after throwing an instance of 'std::bad_array_length' what(): std::bad_array_length
-
我们的第一个for循环for(i=0;i<n&&k!=0;i++)其中k!=0是为了只输出一次,并且用于当不存在两个数时完成下面的if,如果我们想把每个能完成的都输出了,可以删去这个&&k!=0。
-
第二个for循环就显得简单的很多了,其中为了解决题目中的两个元素不能相等,则令j!=i。而其中的k=0是为了说明有至少两个元素符合条件。
-
if(nums[i]+nums[j]==target),这个式子是当满足两个元素相加等于我们需要的数时,执行if的内容,而if内直接输出着两个元素下标,而(i>j)?i ,j:j, i式子是为了满足我们从小到大按顺序输出数组元素下标。
-
循环外的if(k)是当我们循环完之后发现找不到两个数组元素满足这个条件,则k=1为真,执行if内的 “数组中没有两个元素使它成立”,当循环中存在两个元素时,则k变为0,从而if为假不执行。至此,这个程序就结束了,很简单吧。
6.0全列情况程序
#include<stdio.h>
int main()
{
int n=8;
int nums[n]={2,3,4,5,4,3,6};
int target=7;
int i=0,j=0;
int k=1;
for(i=0;i<n;i++){
for(j=0;j!=i&&j<n;j++){
if(nums[i]+nums[j]==target){
printf("输出的为nms[%d]+nums[%d]\n",(i>j)?i ,j:j, i);
k=0;
break;
}
}
}
if(k){
printf("数组中没有两个元素使它成立");
}
return 0;
}
7.0三目运算符拓展
三目运算符的形式为? :
用到时可以写为A?B:C
其含义为当A为真时输出B,否则输出C。