【CSDN】每日一练(10)

第一题

千问万问

题目描述

给定大小为n的整数序列A. 现在会有q次询问,询问子区间的不同整数的数量。

输入描述:

第一行输入整数n,q.(1<=n,q<=1000) 第二行输入n个整数.(1<=a<=100000) 以下q行每行两个整数l,r。(1<=l,r<=100000)

输出描述:

输出区间内的整数数量。

输入样例

10 3
1 2 3 4 5 6 7 8 9 10
1 1
1 2
1 3

输出样例

1
2
3

题解

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int a[N], s[N];
int main() {
	int n, m, x;
	cin>>n>>m;
	memset(a, 0, sizeof a);
	memset(s, 0, sizeof s);
	for (int i = 0; i < n; i++) {
		cin>>x;
		a[x]++;
	}
	for (int i = 1; i <= N - 1; i++) s[i] = s[i - 1] + a[i];
	while(m--) {
		int l, r;
		cin>>l>>r;
		cout<<s[r] - s[l-1]<<endl;
	}
	return 0;
}

第二题

字符串全排列

题目描述

对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串? 比如[“ABC”, “ACB”, “BAC”, “CAB”, “CBA”] 返回 “BCA”

输入描述:

第一行输入整数n,表示给定n个字符串。(n == x!-1,2<=x<=10) 以下n行每行输入一个字符串。

输出描述:

输出全排列缺少的字符串。

输入样例

5
ABC
ACB
BAC
CAB
CBA

输出样例

BCA

题解

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int n;
    char str[100]={0};
    char s[100]={0};
    cin>>n;
    cin>>str;
    int len = strlen(str);
    if(n==1)
    {
        for(int i = 0; i < len; i++)
        {
            s[i] = str[len-i-1];
        }
        cout<<s<<endl;
        return 0;
    }
    for(int i = 1; i < n; i++)
    {
        cin>>s;
        for(int j = 0; j < len; j++)
        {
            str[j] = str[j] ^ s[j];
        }
    }
    cout<<str<<endl;
 
    return 0;
}

第三题

删除排序链表中的重复元素 II

题目描述

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

输入样例

head = [1,2,3,3,4,4,5]

输出样例

[1,2,5]

题解

#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
	int val;
	struct ListNode *next;
};
struct ListNode *deleteDuplicates(struct ListNode *head)
{
	struct ListNode dummy;
	struct ListNode *p, *q, *prev;
	prev = &dummy;
	dummy.next = head;
	p = q = head;
	while (p != NULL)
	{
		while (q != NULL && q->val == p->val)
{
	q = q->next;
}
if (p->next == q)
{
	prev = p;
}
else
{
	prev->next = q;
}
p = q;
	}
	return dummy.next;
}
int main(int argc, char **argv)
{
	int i;
	struct ListNode *head = NULL;
	struct ListNode *prev = NULL;
	struct ListNode *p;
	for (i = 0; i < argc - 1; i++)
	{
		p = malloc(sizeof(*p));
		p->val = atoi(argv[i + 1]);
		p->next = NULL;
		if (head == NULL)
		{
			head = p;
			prev = head;
		}
		else
		{
			prev->next = p;
			prev = p;
		}
	}
	p = deleteDuplicates(head);
	while (p != NULL)
	{
		printf("%d ", p->val);
		p = p->next;
	}
	printf("\n");
	return 0;
}

希望对大家的每日一练有帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值