机试day4

找x

找x_牛客题霸_牛客网 (nowcoder.com)

描述

输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。

输入描述

测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。

输出描述

对于每组输入,请输出结果

输入:
2
1 3
0
输出:
-1

思路:直接一个个找

#include <iostream>
using namespace std;

int main() {
    int n;
    while(scanf("%d", &n)!=EOF) {
        int a[n], x;
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }
        scanf("%d", &x);
        int i = 0;
        for (; i < n; i++) {
            if (a[i] == x) {
                printf("%d\n", i);
                break;
            }
        }
        if (i == n) 
            printf("-1");
    }
}

查找

查找_牛客题霸_牛客网 (nowcoder.com)

描述

输入数组长度 n 输入数组 a[1...n] 输入查找个数m 输入查找数字b[1...m] 输出 YES or NO 查找有则YES 否则NO 。

输入描述

输入有多组数据。 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。

输出描述

如果在n个数组中输出YES否则输出NO。

输入:
5
1 5 2 4 3
3
2 5 6
输出:
YES
YES
NO

思路:sort并二分查找

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int n, m;
    while(scanf("%d", &n)!=EOF) {
        int a[n];
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
        }      
        sort(a, a+n);
        scanf("%d", &m);
        for (int i = 0; i < m; i++) {
            int x;
            scanf("%d", &x);
            int low = 0, high = n - 1;
            while(low <= high) {
                int mid = (low + high) / 2;
                if (x == a[mid]) {
                    printf("YES\n");
                    break;
                } else if (x < a[mid]) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            if (low > high) 
                printf("NO\n");
        }
    }
}

注意:mid = (low + high) / 2; 这里其实用 mid = low + (high - low) / 2 其实更好,可以防止整型溢出的情况【但通常不会有那么多的数要排吧】

找最小数

找最小数_牛客题霸_牛客网 (nowcoder.com)

描述

第一行输入一个数n,1 <= n <= 1000,下面输入n行数据,每一行有两个数,分别是x y。输出一组x y,该组数据是所有数据中x最小,且在x相等的情况下y最小的。

输入描述

输入有多组数据。 每组输入n,然后输入n个整数对。

输出描述

输出最小的整数对。

输入:
5  
3 3  
2 2  
5 5  
2 1  
3 6
输出:
2 1

思路:视为结构,并进行sort排序

#include <iostream>
#include <algorithm>
using namespace std;

struct Data {
    int x, y;
};

bool compare(Data a, Data b) {
    if (a.x == b.x) {
        return a.y < b.y;
    } else {
        return a.x < b.x;
    }
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        Data d[n];
        for (int i = 0; i < n; i++) {
            scanf("%d %d", &d[i].x, &d[i].y);
        }
        sort(d, d + n, compare);
        printf("%d %d\n", d[0].x, d[0].y);     
    }
}

打印极值点下标

打印极值点下标_牛客题霸_牛客网 (nowcoder.com)

描述

在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数, 或者小于所有它相邻的整数,则称该整数为一个极值点,极值点的下标就是i。

输入描述

每个案例第一行为此数组元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔

输出描述

每个案例输出为n个数字(其中n为该案例中极值点的个数):每个数字对应相应数组的相应极值点下标值,下标值之间用空格分隔。

思路:就是一个判断呗

#include <iostream>
using namespace std;

int main() {
    int k;
    while (scanf("%d", &k) != EOF) {
        int d[k];
        for (int i = 0; i < k; i++)
            scanf("%d", &d[i]);
        if (d[0] != d[1])
            printf("0 ");
        for (int i = 1; i < k - 1; i++) {
            if ((d[i - 1] < d[i] && d[i + 1] < d[i]) || (d[i - 1] > d[i] && d[i + 1] > d[i]))
                printf("%d ", i);
        }
        if (d[k - 1] != d[k - 2])
            printf("%d", k - 1);
        printf("\n");
    }
}

找位置

描述

对给定的一个字符串,找出有重复的字符,并给出其位置,如:abcaaAB12ab12 输出:a,1;a,4;a,5;a,10,b,2;b,11,1,8;1,12, 2,9;2,13。

输入描述

输入包括一个由字母和数字组成的字符串,其长度不超过100。

输出描述

可能有多组测试数据,对于每组数据, 按照样例输出的格式将字符出现的位置标出。 1、下标从0开始。 2、相同的字母在一行表示出其出现过的位置。

输入:
abcaaAB12ab12
输出:
a:0,a:3,a:4,a:9
b:1,b:10
1:7,1:11
2:8,2:12

思路:这题不简单,看了题解好多都用了c++的map、vector,不用的话实现起来挺困难的

但是依然能看到大佬不用这些就解决的思路,如下思路:每找到一个新的字符,去后面找所有和他相同的,找到设置为*,并每次找到后打印上一个,最后循环完,如果tmp的值仍和i相同,说明没有找到相同的字符;找到就输出

#include <iostream>
using namespace std;

int main() {
    string s;
    while (cin >> s) {
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '*') 
                continue;
            int tmp = i;
            for (int j = i + 1; j < s.size(); j++) {
                if (s[j] == s[i]) {
                    s[j] = '*';
                    printf("%c:%d,", s[i], tmp);
                    tmp = j;
                }
            }
            if (tmp != i)
                printf("%c:%d\n", s[i], tmp);
        }
    }
}
最后修改:2023 年 05 月 29 日
如果觉得我的文章对你有用,请随意赞赏