查找整数

问题描述

给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

输入格式

第一行包含一个整数n。

第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。

第三行包含一个整数a,为待查找的数。

输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000。

import java.util.Scanner;

public class SeekInt {

	public static void main(String[] args){		
		Scanner sc = new Scanner(System.in);
		int a[] = new int[1002]; 
		int n = sc.nextInt();
		for(int i=1; i<=n; i++){
			a[i] = sc.nextInt();			
		}
		
		int b = sc.nextInt();
		int index = -1;
		for(int i=1; i<=n; i++){			
			if(a[i] == b){
				index = i;
				break;
			}	
		}
		
		System.out.println(index);
	}
}


<think>我们参考用户的问题,他想要实现查找整数的功能。根据引用内容,常见的查找算法有顺序查找和二分查找。用户之前的问题是关于从整数序列中找出最小值及其最大下标,但现在的问题查找整数(可能是查找特定值)。因此,我们需要考虑两种查找算法:顺序查找(线性查找)和二分查找(要求数组有序)。用户需求:用C语言实现查找整数的功能。我们可以提供两种方法:1.顺序查找:适用于无序数组,时间复杂度为$O(n)$。2.二分查找:适用于有序数组,时间复杂度为$O(\logn)$。由于用户没有说明数组是否有序,我们可以先实现顺序查找,然后实现二分查找,并说明适用条件。另外,引用[3]中提到了二分查找的一个注意事项:计算中间位置时避免整数溢出,应该使用mid=low+(high-low)/2。我们根据引用[1]和引用[2]中的顺序查找代码,以及引用[3]中的二分查找代码,来实现这两个功能。步骤:1.顺序查找:遍历数组,找到目标整数则返回其下标,否则返回-1。2.二分查找:要求数组有序。通过不断缩小查找范围来定位目标值。注意:顺序查找中,引用[1]提供了两种方法,其中第二种方法使用哨兵,但我们这里使用第一种简单直观的方法。我们将分别编写两个函数:-sequentialSearch:顺序查找-binarySearch:二分查找同时,我们提供一个主函数来测试,并让用户输入数组和要查找整数。注意:用户可能需要查找整数在数组中第一次出现的位置,或者是任意一次出现的位置。这里我们按照顺序查找会返回第一次出现的位置,而二分查找返回的是任意一个位置(可能有多个相同值,返回其中一个)。如果用户需要特定要求,可以扩展。由于用户之前的示例代码中,顺序查找返回的是最大下标(对于最小值而言),但这里用户要求的是查找整数,我们通常返回第一次出现的下标或者任意一个下标(根据算法而定)。这里我们按照常规:顺序查找返回第一次出现的位置,二分查找返回其中一个位置(不保证是第一个或最后一个)。如果需要返回特定位置,比如第一次出现或最后一次出现,我们需要修改算法(例如,顺序查找时记录第一个或最后一个),但用户当前问题没有特别要求,我们先实现基本功能。我们将分别展示两个函数的实现,并在主函数中根据数组是否有序选择不同的查找算法。但是,由于用户没有提供数组是否有序,我们可以在程序中先判断数组是否有序(升序或降序)?这可能会增加复杂度。我们不如让用户自己选择使用哪种查找算法,或者由用户输入数组时指定有序性。为了简化,我们在程序中预设数组是无序的,所以默认使用顺序查找。如果用户想用二分查找,我们要求数组有序(可以提示用户先排序)。另一种做法:我们同时提供两种方法,在主函数中给出两种方法的调用示例。我们选择:同时提供两个函数,并分别演示。注意:二分查找要求数组有序,如果数组无序,我们需要先排序(这里不实现排序,只假设数组有序)。因此,我们这样设计:1.顺序查找函数:无论数组有序无序都能用。2.二分查找函数:要求数组有序(由调用者保证)。并且,在演示中,我们使用同一个数组(在演示二分查找时,我们先对数组排序?这样会改变原数组,所以我们用另一个有序数组来演示二分查找)。为了避免混淆,我们分别用两个数组:一个无序数组用于顺序查找,一个有序数组用于二分查找。具体步骤:1.顺序查找函数:intsequentialSearch(intarr[],intn,intkey)2.二分查找函数:intbinarySearch(intarr[],intn,intkey)然后,我们在主函数中分别测试。根据引用[3],二分查找注意避免整数溢出:使用mid=low+(high-low)/2。代码实现如下:</think> 以下是使用 C 语言实现整数查找功能的两种常用算法实现及详细解析: ### 1. 顺序查找(线性查找) ```c #include <stdio.h> // 顺序查找函数 int sequentialSearch(int arr[], int n, int key) { for (int i = 0; i < n; i++) { if (arr[i] == key) { return i; // 找到则返回索引位置 } } return -1; // 未找到返回 -1 } int main() { int arr[] = {5, 2, 8, 2, 1, 3, 1, 5}; int n = sizeof(arr) / sizeof(arr[0]); int key = 3; // 要查找的值 int index = sequentialSearch(arr, n, key); if (index == -1) { printf("%d not found in array\n", key); } else { printf("%d found at index %d\n", key, index); } return 0; } ``` **算法特性:** - **时间复杂度**:$O(n)$(最坏情况需遍历整个数组) - **空间复杂度**:$O(1)$(只需常数空间) - **适用场景**:适用于无序数组或小规模数据[^1] - **优点**:实现简单,无需预处理 - **缺点**:效率较低,大数据集性能不佳 ### 2. 二分查找(折半查找) ```c #include <stdio.h> // 二分查找函数(要求数组已排序) int binarySearch(int arr[], int n, int key) { int low = 0; int high = n - 1; while (low <= high) { // 避免整数溢出的中点计算 int mid = low + (high - low) / 2; if (arr[mid] == key) { return mid; // 找到目标值 } else if (arr[mid] < key) { low = mid + 1; // 目标值在右半区 } else { high = mid - 1; // 目标值在左半区 } } return -1; // 未找到 } int main() { // 有序数组 int arr[] = {1, 2, 3, 5, 8, 13, 21, 34}; int n = sizeof(arr) / sizeof(arr[0]); int key = 13; int index = binarySearch(arr, n, key); if (index == -1) { printf("%d not found\n", key); } else { printf("%d found at index %d\n", key, index); } return 0; } ``` **算法特性:** - **时间复杂度**:$O(\log n)$(每次比较缩小一半搜索范围) - **空间复杂度**:$O(1)$ - **适用场景**:适用于大型有序数据集[^3] - **前置条件**:数组必须已排序 - **优点**:查找效率高 - **缺点**:需要预处理(排序),不适合频繁变动的数据集 ### 算法选择建议: 1. 若数据**无序且规模小**(n < 100)→ 使用顺序查找 2. 若数据**有序或需要多次查询** → 优先选择二分查找 3. 若数据**频繁变动** → 顺序查找更合适(避免重复排序开销)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值