小红喜欢1
思路
拿到这题第一反应是什么?一个数组里只有一个 1,其余全是 0,找到那个 1 的下标就行了。
那怎么找?直接从头到尾扫一遍,碰到 1 就输出当前位置,结束。没有比这更直接的做法了。
注意一个细节:题目要求的下标是 从 1 开始 的,不是从 0 开始,所以计数器从 1 开始累加就好。
另外,题目输入没有先给数组长度 n,而是直接给了一行数字,所以我们边读边判断就行,读到 1 立刻输出并退出,甚至不需要把整个数组存下来。
代码
#include <iostream>
using namespace std;
int main(){
int x, i = 0;
while(cin >> x){
i++; // 下标从1开始
if(x == 1){
cout << i << endl; // 找到1,输出并结束
return 0;
}
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int i = 0;
while (sc.hasNextInt()) {
i++; // 下标从1开始
if (sc.nextInt() == 1) {
System.out.println(i); // 找到1,输出并结束
return;
}
}
}
}
nums = list(map(int, input().split()))
for i, x in enumerate(nums):
if x == 1:
print(i + 1)
break
const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
const lines = [];
rl.on('line', line => lines.push(line));
rl.on('close', () => {
const nums = lines[0].split(' ').map(Number);
for (let i = 0; i < nums.length; i++) {
if (nums[i] === 1) {
console.log(i + 1);
break;
}
}
});
复杂度分析
- 时间复杂度:
,最坏情况下扫描整个数组。
- 空间复杂度:
,只用了一个计数器和一个临时变量,没有额外存储。
小结
这题就是纯粹的线性扫描,没什么弯弯绕。唯一要留意的就是下标从 1 开始,别写成从 0 开始就好。另外这里用了「边读边判」的写法,不需要先存数组再遍历,对于这种只需要找一个目标的场景挺实用的。



京公网安备 11010502036488号