3.18毎日練習

  1. 进制转换

描述

给定一个十进制数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.统计回文

统计回文_牛客题霸_牛客网 (nowcoder.com)

描述

“回文串”是一个正读和反读都一样的字符串,比如“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.连续最大和

连续最大和_牛客题霸_牛客网 (nowcoder.com)

描述

一个数组有 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;
}

实时更新最大值不需要额外开空间也不需要排序找最大状态值啦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值