给定一个从小到大排列的有序整数数组a[n](n≤10 6 )和一个整数k,输出k在数组中的最大下标(从0开始),如果数组中不存在该数,则输出-1。

给定一个从小到大排列的有序整数数组a[n](n≤10
6
)和一个整数k,输出k在数组中的最大下标(从0开始),如果数组中不存在该数,则输出-1。

从数组中a[n-1]开始,直到a[0]倒序找k,找到返回对应下标,找不到返回-1

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7619537
  • 这篇博客也不错, 你可以看下7-6本题要求编写C程序,将输入的n个整数存入数组a中,然后在数组a中查找给定的x。如果数组a中的元素与x的值相同,输出所有满足条件的元素的下标(下标从0开始)
  • 除此之外, 这篇博客: 1091 N-自守数 (15 分) 还有 测试点2中的 题目说了,给你一个数A,如果这个数的平方乘于一个小于10的整数的结果的结尾是A,那么就输出 那个小于10的整数 和 验证结尾是A的结果。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    这就好办了,我们很好得出

    我们只需要一个对N(<10)的循环, 代入题目的公式,然后计算出验证的结果再和 你输入的数进行比较 这样就满足了条件。

     

    #define _CRT_SECURE_NO_WARNINGS
    #include <math.h>
    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <sstream>
    #include <cstdio>
    
    using namespace std;
    
    string inttostring(int in) { // 标准的数字转字符串
    
    	stringstream os;
    	os << in;
    	string od;
    	os >> od;
    	return od;
    }
    
    bool check(int sum, int c) { // 检查末尾的函数 方法是倒着检查
    
    	string ssum = inttostring(sum);
    	string cc = inttostring(c);
    
    	for (int i = cc.size() - 1, j = ssum.size() - 1;i >= 0;i--, j--) {
    		if (cc[i] != ssum[j]) {
    			return false;
    		}
    	}
    	return true;
    }
    
    bool find_NK(int& n, int& k, int inp) { // 寻找N,K的函数 使用了题目的要求
    	k = n = -0x3f3f3f3f;
    
    	for (n = 1;n <= 10;n++) {
    
    		k = inp * inp * n;
    		if (check(k, inp)) {
    			k = (int)sqrt(k * 1.0 / n);
    			return true;
    		}
    	}
    	return false;
    }
    
    #include <vector>
    int main(int argc, char** argv) { // 主函数 调用各个模块
    
    	int N, K;
    
    	int t, inp;
    	scanf("%d", &t);
    
    	for (int tv = t;tv--;) {
    
    		scanf("%d", &inp);
    		bool pl = find_NK(N, K, inp);
    		if (pl) {
    			printf("%d %d\n", N, N * K * K);
    		}
    		else {
    			cout << "No" << endl;
    		}
    
    	}
    
    	system("pause");
    	return 0;
    }

     

  • 以下回答来自chatgpt:

    我可以解决该问题。

    解决方案如下:

    1. 遍历整个有序整数数组,逐一比较每个元素与所要查找的整数,直到找到相等的元素或者比所要查找的整数大的元素,此时结束遍历,输出找到的元素下标。

    2. 如果遍历整个数组之后仍然没有找到相等的元素,则输出-1。

    代码如下:

    def find_max_index(arr, target):
        """
        在有序整数数组arr中查找元素target的最大下标
        """
        low, high = 0, len(arr) - 1
        while low <= high:
            mid = (low + high) // 2  # 用二分法查找元素target在arr中的位置
            if arr[mid] == target:
                # 找到了相等的元素,继续往右查找,直到找到最后一个相等的元素
                while mid < len(arr) - 1 and arr[mid+1] == target:
                    mid += 1
                return mid
            elif arr[mid] < target:
                # 如果中间元素比目标元素小,则在右半部分查找
                low = mid + 1
            else:
                # 如果中间元素比目标元素大,则在左半部分查找
                high = mid - 1
        # 没有找到相等的元素
        return -1
    

    数组长度最大为可以达到Python列表的最大长度,大概是10^7左右。当然,具体取决于系统内存的大小。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^