鱼C论坛

 找回密码
 立即注册
查看: 464|回复: 2

运行超时,优化代码

[复制链接]
发表于 2024-1-28 19:39:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <bits/stdc++.h>
using namespace std;
int main()
{
    string s,a,b;
    cin>>s;
    a=s;
    do
    {
        b=s;
        reverse(s.begin(),s.end()); //将s翻一下
        if(s!=a&&b==s)
        {
            cout<<s<<endl;
            return 0;
        }
        
    }while(next_permutation(s.begin(),s.end()));
    cout<<"-1"<<endl;
    
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-1-28 19:40:06 | 显示全部楼层
这段代码是为了判断一个字符串是否为回文数。目前的问题是运行超时,可以尝试优化一下代码。

首先,你可以将翻转字符串的操作放到循环外面,这样可以减少每次循环中的重复计算。

另外,你可以使用双指针来判断是否为回文数,而不是每次都调用`reverse`函数。双指针从字符串的两端开始向中间移动,如果遇到不相等的字符,则不是回文数。

下面是优化后的代码:
#include <iostream>
#include <string>
using namespace std;

bool isPalindrome(string s) {
    int left = 0;
    int right = s.length() - 1;
    
    while (left < right) {
        if (s[left] != s[right]) {
            return false;
        }
        left++;
        right--;
    }
    
    return true;
}

int main() {
    string s;
    cin >> s;
    
    string reversed = s;
    reverse(reversed.begin(), reversed.end()); // 将s翻一下
    
    if (s != reversed && isPalindrome(s)) {
        cout << "是回文数" << endl;
    } else {
        cout << "不是回文数" << endl;
    }
    
    return 0;
}

这样,代码应该会更快地运行并避免超时的情况发生。如果还有问题,请随时问我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-1-28 20:09:11 | 显示全部楼层
这个问题可能是给你一个字符串,是否可以通过字符重组得到一个回文串,这个代码需要枚举每一个字符串的排列,大概会执行 |S|! 次运算。

你可以这样想,偶数次数出现的字符你可以分别放在字符串的两边(放在两边的字符数量相等),奇数次数出现的话,可以通过减去一个字符变成偶数,然后继续这么做,最后剩下的一个放在字符串的最中间。

如果奇数次数出现的字符有两个及其以上,就说明无解。

可以自己写一写,如果写不对再来问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 19:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表