查找不在数组里的字母

查找数组中缺失的26个字母
本文介绍了一种算法,用于在一个包含多个字母的数组中查找未出现的26个字母。通过维护一个整型数组来跟踪每个字母的出现情况,并最终输出未出现的字母。

题目:有一个数组包含 很多字母,如何查找 26 个字母 不在 里面的字母

            eg: {a,b,c,c,c,c} 那么就是 d - z

算法思路:维护一个 整形数组 对应 字母数组的 asci 码, 查找 字母数组,如果某字母出现一次,对应的 整形数组 就 + 1。最后,整形 数组为 0 的,就是没出现的。

C#代码实现如下:

            //1. 1+'a' 会得到一个数字
            //2. 为了使 算法更完善,加入一个 计数,如果 26 个字母都找到了,就不需要在找了

            char[] chArr = new char[] { 'a', 'b', 'c', 'd', 'e', 'g', 'k', 'k', 'l', 'l', 'z' };
            int[] intArr = new int[26];
            int num = 26;

            for(int i = 0;i < chArr.Length;i++)
            {
                if (intArr[chArr[i] - 'a'] == 0 && num > 0)
                {
                    intArr[chArr[i] - 'a']++;
                    num--;
                }
            }

            for (int i = 0; i < intArr.Length;i++ )
            {
                if (intArr[i] == 0)
                    Console.WriteLine(Convert.ToChar(i + 'a'));
            }

这只是本人的想法和实现,如果有其它意见的,欢迎提出讨论。


在C语言中,折半查找(也称为二分查找)是一种高效的查找算法,适用于**有序数组**。其基本思想是通过将目标值与数组中间元素进行比较,逐步缩小查找范围,从而快速定位目标值的位置。 ### 折半查找的实现方法 以下是一个完整的代码示例,展示了如何在升序数组中使用折半查找: ```c #include <stdio.h> // 定义折半查找函数 int binary_search(int arr[], int size, int target) { int left = 0; int right = size - 1; while (left <= right) { int mid = left + (right - left) / 2; // 避免溢出 if (arr[mid] == target) { return mid; // 找到目标值,返回索引 } else if (arr[mid] < target) { left = mid + 1; // 目标值在右半部分 } else { right = mid - 1; // 目标值在左半部分 } } return -1; // 未找到目标值 } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 升序数组 int size = sizeof(arr) / sizeof(arr[0]); // 计算数组长度 int target; printf("请输入要查找的目标值: "); scanf("%d", &target); int result = binary_search(arr, size, target); // 调用折半查找函数 if (result != -1) { printf("找到了!目标值位于数组的第 %d 个位置。\n", result); } else { printf("未找到目标值。\n"); } return 0; } ``` ### 代码解析 1. **binary_search函数**:这是核心的折半查找逻辑。 - `left` 和 `right` 分别表示当前查找范围的左右边界。 - `mid` 是中间位置的索引,通过 `left + (right - left) / 2` 来计算,以避免整数溢出问题[^2]。 - 如果 `arr[mid]` 等于目标值,则直接返回该索引。 - 如果 `arr[mid]` 小于目标值,则更新左边界为 `mid + 1`,继续在右半部分查找。 - 如果 `arr[mid]` 大于目标值,则更新右边界为 `mid - 1`,继续在左半部分查找。 - 当 `left > right` 时,说明整个数组中没有目标值,返回 `-1` 表示未找到。 2. **main函数**: - 定义了一个升序数组 `arr`。 - 使用 `sizeof` 计算数组的大小。 - 提示用户输入目标值,并调用 `binary_search` 函数进行查找。 - 根据返回结果输出查找结果。 ### 折半查找的特点 - **时间复杂度**:折半查找的时间复杂度为 $O(\log n)$,比线性查找的 $O(n)$ 更高效。 - **适用条件**:折半查找要求数组必须是**有序的**,否则无法正确工作。 - **稳定性**:折半查找本身不涉及交换操作,因此不会改变相同元素的相对顺序,是一种稳定的查找算法[^5]。 ### 插值查找的优化 如果数据分布较为均匀,可以考虑使用插值查找来进一步优化查找效率。插值查找的基本思想是根据目标值和数组两端值的比例关系来选择分割点,而不是固定取中间点。例如,在字典中查找 "apple" 时,人们通常会直接翻到字母 A 的区域,而不是从中间开始逐页查找。 以下是插值查找的代码实现: ```c #include <stdio.h> int interpolation_search(int arr[], int size, int target) { int left = 0; int right = size - 1; while (left <= right && target >= arr[left] && target <= arr[right]) { int pos = left + ((double)(target - arr[left]) / (arr[right] - arr[left])) * (right - left); if (arr[pos] == target) { return pos; // 找到目标值,返回索引 } else if (arr[pos] < target) { left = pos + 1; // 目标值在右半部分 } else { right = pos - 1; // 目标值在左半部分 } } return -1; // 未找到目标值 } int main() { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 升序数组 int size = sizeof(arr) / sizeof(arr[0]); // 计算数组长度 int target; printf("请输入要查找的目标值: "); scanf("%d", &target); int result = interpolation_search(arr, size, target); // 调用插值查找函数 if (result != -1) { printf("找到了!目标值位于数组的第 %d 个位置。\n", result); } else { printf("未找到目标值。\n"); } return 0; } ``` ### 总结 - **折半查找**是一种高效的查找算法,适用于升序数组。 - **插值查找**在数据分布均匀的情况下,查找效率更高,但需要额外的计算。 - 两者都需要数组是有序的,否则无法保证正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值