进制转换
描述
给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例1
输入:
7 2
输出:
111
【题目解析】: 本题题目很简单(但我一开始也没反应过来)题目的本意就是将10进制的数转换成N进制。N(2 ≤ N ≤ 16)可以看出进制最多可以到16进 制。 【解题思路】: 首先想清楚原理:N进制数,每个进制位的值分别是X0*N^0,X1*N^1, X2*N^2.....,X0, X1,X2就是这些进制位的值,就是就是进行取模余数就是当前低进制的位的值是多少,通过除掉进制数,进 入下一个进制位的计算。
#include <iostream>
using namespace std;
#include<string>
#include<algorithm>
int main()
{
int M = 0;//
int N = 0;
cin >> M;
cin >> N;
char flag = 1;
char tables[] = "0123456789ABCDEF";//不能为int也不能{}初始化会有0x啥的
if (M < 0)
{
M = -M;
flag = 0;
}
string ret;
while (M)
{
ret += tables[M % N];
M /= N;
}
if (!flag)
ret += '-';//注意正负
reverse(ret.begin(), ret.end());
if(ret=="")
ret='0';//易错
cout << ret;
return 0;
}
2.统计回文
描述
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
* 在A的第一个字母之前: "baba" 不是回文
* 在第一个字母‘a’之后: "abba" 是回文
* 在字母‘b’之后: "abba" 是回文
* 在第二个字母'a'之后 "abab" 不是回文
所以满足条件的答案为2
输入描述:
每组输入数据共两行。 第一行为字符串A 第二行为字符串B 字符串长度均小于100且只包含小写字母
输出描述:
输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数
示例1
输入:
aba
b
输出:
2
我的思路:我没有思路,只会暴力,每个位置插一遍然后判断喽,牛客没有很狗的用例,就过啦
#include <iostream>
using namespace std;
bool ispalindrome(string& str)
{
int i=0;
int j=str.size()-1;
while(i<j)
{
if(str[i]!=str[j])
return false;
i++;
j--;
}
return true;
}
int main() {
string strA;
string strB;
getline(cin, strA);
getline(cin, strB);
int i=0;
int count=0;
while(i<=strA.size())
{
string str(strA);
str.insert(i,strB);
if(ispalindrome(str))
count++;
i++;
}
cout<<count;
return 0;
}
看看大佬的思路:你是大佬就分享一下呗,我没找到什么很好的方法啦
3.连续最大和
描述
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。
示例1
输入:
3
-1 2 1
输出:
3
解题:经典动规问题
定义一个dp数组,dp[1]表示前1个数字中连续子数组最大值,如果前面的值小于0那么该下标处的值为数组该位置的值本身,这样就定义了一个数组,最后判断该数组的max
#include <iostream>
using namespace std;
#include<algorithm>
int main() {
int n = 0;
cin >> n;
int* arr = new int[n];
int i = 0;
while (i != n)
{
int tmp;
cin >> tmp;
*(arr + i) = tmp;
i++;
}
int* dp = new int[n];
int j = 0;
while (j < n)
{
if (j == 0)
dp[0] = arr[0];
if (j >= 1)
dp[j] = dp[j - 1] > 0 ? dp[j - 1] + arr[j ] : arr[j ];
j++;
}
sort(dp, dp + n);
cout << *(dp + n-1);
return 0;
}
这里写了排序,空间复杂度也利用了额外数组,因此看另一种方法
#include <iostream>
#include<vector>
using namespace std;
int GetMax(int a, int b) //得到两个数的最大值
{
return (a) > (b) ? (a) : (b);
}
int main()
{
int size;
cin >> size;
vector<int> nums(size);
for(size_t i = 0; i < size; ++i)
cin >> nums[i];
int Sum = nums[0]; //临时最大值
int MAX = nums[0]; //比较之后的最大值
for (int i = 1; i < size; i++)
{
Sum = GetMax(Sum + nums[i], nums[i]); //状态方程
if (Sum >= MAX)
MAX = Sum;
}
cout << MAX << endl;
return 0;
}
实时更新最大值不需要额外开空间也不需要排序找最大状态值啦