算法题:求一个数在数组中出现的位置

//有一个int型数组,每两个相邻的数之间的差值不是1就是
//- 1.现在给定一个数,要求查找这个数在数组中的位置。
#include <iostream>
using namespace std;
void Grial(int a[], int n, int val)
{
    //我的思路是从第一个数开始,如果这个数是2,
    //而我要找的数是5,那么最好我也必须向后面
    //跳5-2=3个位置,因为每个数字只相差1或者-1.
    int i = 0;
    int *b = new int[n];//如果全部是val,则需要n空间。
    int k = 0;
    for (; i < n;)
    {
        if (a[i] == val)
        {
            b[k++] = i;
            i++;
        }
        else
        {
            int len = a[i]>val ? a[i] - val : val - a[i];
            i += len;
        }
    }
    cout << val << "出现的下标位置有:";
    for (i=0; i < k; i++)
    {
        cout << b[i] << "  ";
    }
    cout << endl;
}
int main()
{
    int a[] = {2,3,4,5,6,7,6,5,4,3,2,1,2,3,4,5};
    Grial(a, sizeof(a) / sizeof(int),5);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 23:25:10

算法题:求一个数在数组中出现的位置的相关文章

算法题:找出整数数组中两个只出现一次的数字

问题:一个整数数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 分析:这是一个很新颖的关于位运算的题目. 首先考虑这个问题的一个简单版本:一个整数数组里除了一个数字之外,其他的数字都出现两次,请写程序找出这个只出现一次的数字. 这个问题的突破口在哪?题目中数组的性质是只有一个整数出现一次,其他的都出现两次.这样的话就使我们想到了异或运算的性质:任何一个数字异或它自己都等于0.也就是说如果从头到尾依次异或数组中的每

算法题:找出一个数组中相加值最大的连续序列元素

package arithmetic; /** * @author SHI * 求一个数组中相加值最大的连续序列元素 */ public class MaxSequence { public static void main(String[] args) { int[] a=new int[]{-2,9,-3,4,-6,7,-6,4}; findBigSequence(a); } /** * 思想: (1)计算出该数组的所有元素和,假设该值为最大 * (2)从数组下标1到a.length-1依次

算法题:找出一个数组中依次最大的k个元素

package arithmetic; import java.util.Arrays; /** * 找出一个数组中依次最大的k个元素 * @author SHI */ public class FindMaxFigure { public static void main(String[] args) { int[] a=new int[]{1,5,-1,8,0,2}; System.out.println(Arrays.toString(findBigFigure(a, 3))); } /*

小算法:求一个数的乘方 - 使用递归

1 /** 2 * 求一个整数的乘方 3 * @param num 要乘方的数字 4 * @param power 多少次方 5 * @return 6 */ 7 public static int power(int num,int power){ 8 if(power == 1){ 9 return num; 10 } 11 if(power % 2 == 0){ 12 return power(num, power / 2) * power(num, power / 2); 13 }els

(hdu step 2.1.3)Largest prime factor(求一个数的最大质因子的位置)

题目: Largest prime factor Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4868 Accepted Submission(s): 1452   Problem Description Everybody knows any number can be combined by the prime number.Now,

求二维整数数组中最大联通子数组的和

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 1 #include<i

算法题:三个数相加等于某个特定值

题目来自于leetcode第十五题 给定一个n个整数的数组S,是否存在S中的元素a,b,c,使得a + b + c = 0? 查找数组中所有唯一的三元组,它们的总和为零. 注意:解决方案集不能包含重复的三元组. 例子: 给定数组:S = [-1, 0, 1, 2, -1, -4], 解决方案:[[-1, 0, 1],[-1, -1, 2]]. 在刚看到这道题目的题目的时候,首先想到的就是暴力解法,将数组排序后直接嵌套三个循环,这样子虽然简单,但是时间复杂度确实n^3,遇到数据量过大的时候消耗太大

算法题 求时间复杂度

//题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度是O(n).考虑多对同时满足的情况例如输入数组1.2.4.7.11.15和数字15.由于4+11=15,因此输出4和11. 代码 function time_complexity($arr,$n){ foreach ($arr as $k=>$v) { foreach ($arr as $key => $val) { if ($v + $val == $n) { return

一天一个算法:求俩个数的最大公约数和最小公倍数

求俩个数的最大公约数和最小公倍数 解答: 当较大数除以较小数余数等于0时,较小数为最大公约数. 两数相乘结果除以它们的最大公约数为最小公倍数. int cdivisor(int x1,int y1) { int r,temp; if (x1<y1) { temp =x1; x1 = y1; y1 = temp; } while(x1%y1)//当较大数除以较小数余数等于0时,较小数为最大公约数 { r=x1%y1; x1=y1; y1=r; } return y1; } int cmultipl