【优快云】每日一练(22)

目录

第一题

单词逆序

题目描述

输入描述:

输出描述:

输入样例

输出样例

题解

第二题

不喜欢带钱的小C

题目描述:

输入格式:

输出格式:

输入样例

输出样例

题解

第三题

查找整数

题目描述

输入描述:

输出描述:

输入样例

输出样例

题解

第四题

找出字符串中第一个只出现一次的字符

输入描述:

输出描述:

输入样例

输出样例

题解

第五题

整数转罗马数字

输入样例

输出样例

题解


第一题

单词逆序

题目描述

对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,你需要将这些部分逆序。 给定一个原字符串A,请返回逆序后的字符串。例,输入”I am a boy!“输出”boy! a am I“

输入描述:

输入一行字符串str。(1<=strlen(str)<=10000)

输出描述:

返回逆序后的字符串。

输入样例

It’s a dog!

输出样例

dog! a It’s

题解

#include <stdio.h>
#include <string.h> 
#define N 1000000
int  main() {
    char str[N];
    int strLen;
    int head;
    int tail;
    int index;
 
    gets(&str);
    tail = head = strlen(&str) - 1;
 
    for(head; head >= -1; ) {
        if(head != -1 && str[head] != ' ') {
            head--;
        } else {
            if(tail != head) {
                for(index = head + 1; index <= tail; index++) {
                    printf("%c", str[index]);
                }
                printf(" ");
                head--;
                tail = head;
            }
        }
    }   
    return 0;
}

第二题

不喜欢带钱的小C

题目描述:

小C不喜欢带钱,有一次竟被他碰上了一家不能使用移动支付(也不能找钱)的神秘商店。请问小C至少准备多少张RMB才能恰好支付n元。RMB的面额有100元,50元,20元,10元,5元,1元。

输入格式:

输入一个整数n

输出格式:

最少带几张。

输入样例

50

输出样例

1

题解

#include <iostream>
using namespace std;
int solve(int tar, int * meta, int metan, int * seed = NULL, int seedn = 0)
{
	if (tar == 0)
	{
		return seedn;
	}
	int min = -1;
	int m;
	int * seed1 = new int[seedn + 1];
	if (seed)
		memcpy(seed1, seed, sizeof(int) * seedn);
	for (int i = 0; i < metan; i++)
	{
		if (meta[i] <= tar)
		{
			seed1[seedn] = meta[i];
			m = solve(tar - meta[i], meta, metan, seed1, seedn);
			if (m != -1 && (min == -1 || min > m))
				min = m;
			break;
		}
	}
	delete[] seed1;
	return min;
}
int main()
{
	int arr[] = { 100, 50, 20, 10, 5, 1 };
	int n = 6;
	int total;
	cin >> total;
	int result = solve(total, arr, n);
	cout << result << endl;
	return 0;
}

第三题

查找整数

题目描述

给定一个非降序的整数数组,数组中包含重复数字(重复数字很多) ,给定任意整数,对数组进行二分查找,返回数组正确的位置,给出函数实现。 a. 连续相同的数字,返回最后一个匹配的位置 b. 如果数字不存在返回 -1。(测试用例仅做参考,我们会根据代码质量进行评分)

输入描述:

第一行给定数组长度n,目标值tar。(1<=n,tar<=10000) 第二行给出n个整数a.(1<=a<=10000)

输出描述:

按题目描述输出。

输入样例

7 4
1 2 2 3 4 4 10

输出样例

5

题解

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n, tar;
	cin >> n >> tar;
	int arr[n + 1];
	for (int i = 0; i < n; ++i) scanf("%d", &arr[i]);
	int l = 0, r = n - 1;
	while (l < r) {
		int mid = (l + r + 1) >> 1;
		if (arr[mid] <= tar) l = mid;
		else r = mid - 1;
	}
	if (arr[l] != tar) cout << -1 << endl;
	else cout << l << endl;
	return 0;
}

第四题

找出字符串中第一个只出现一次的字符

输入描述:

输入一个非空字符串

输出描述:

输出第一个只出现一次的字符,如果不存在输出-1

输入样例

asdfasdfo

输出样例

o

题解

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    while (getline(cin, str))
    {
        int a[256] = {0};
        bool flag = false;
        for (int i = 0; i < str.size(); ++i)
            a[str[i]++];
        for (int i = 0; i < str.size(); ++i)
        {
            if (a[str[i]] == 1)
            {
                cout << str[i] << endl;
                flag = true;
                break;
            }
        }
        if (flag == false)
            cout << "-1" << endl;
    }
    return 0;
}

第五题

整数转罗马数字

马数字包含以下七种字符: I, V, X, LCD 和 M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给你一个整数,将其转为罗马数字。

输入样例

num = 3

输出样例

 "III"

题解

#include<string.h>
struct rmap
{
	char *r;
	int v;
} units[] = {
	{"M", 1000},
	{"CM", 900},
	{"D", 500},
	{"CD", 400},
	{"C", 100},
	{"XC", 90},
	{"L", 50},
	{"XL", 40},
	{"X", 10},
	{"IX", 9},
	{"V", 5},
	{"IV", 4},
	{"I", 1}};
char result[64];
char *intToRoman(int num)
{
	result[0] = 0;
	int ri = 0;
	int i = 0;
	while (num)
	{
        if (num >= units[i].v)
{
    strcat(result, units[i].r);
    num = units[i].v;
}
		else
		{
			i++;
		}
	}
	return result;
}

这五道题比较难,各位可以看一看,希望对大家有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值