小红喜欢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 开始就好。另外这里用了「边读边判」的写法,不需要先存数组再遍历,对于这种只需要找一个目标的场景挺实用的。