目录
第一题
单词逆序
题目描述
对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,你需要将这些部分逆序。 给定一个原字符串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
, L
,C
,D
和 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;
}
这五道题比较难,各位可以看一看,希望对大家有用。