最长的指定瑕疵度的元音子串

解题思路

其实这道题就是典型的双指针问题,左边指针从字符串的左边0位置开始找,右边指针从字符串位置字符串长度减1的位置开始找。

1.以aabuuba为例,进入while循环,判断左边位置是否为元音,如果不是就是left++,进入下一次循环。

2.判断右边位置是否为元音,如果不是就right--,进入下一个循环。

3.如果左右都是元音,案例刚进入循环都是元音,这个时候就要注意了,这个时候不能单纯的left++,right--处理,因为如果left++。那么结果可能就是uuba,长度为4.这个结果是不对的,正确的结果是aabuu。

解决思路在下面具体代码中

代码


std::vector<char> VowelChars = { 'a','o','e','i','u' };

//判断当前字符是否为元音
bool IsVowel(char chr)
{
    //转换为小写字母
    chr=std::tolower(chr);
    if (std::find(VowelChars.begin(), VowelChars.end(), chr) == VowelChars.end())
        return false;
    return true;
}
//获取瑕疵度
int GetDefectDeep(std::string& str)
{
    int deep = 0;
    for (auto c : str)
    {
        if (!IsVowel(c))
            deep++;
    }
    return deep;
}

//获取最长指定瑕疵度的元音字符串长度 
//str:原始字符串
//deep:指定的瑕疵度
int GetMaxVowelStringLenght(std::string& str, int deep)
{
    //采用双指针的做法,左边从0开始,右边从尾部开始
    int left = 0;
    int right = str.length() - 1;
    int max = 0;
    while (right >= left)
    {
        if (!IsVowel(str[right]))
        {
            right--;
            continue;
        }
        if (!IsVowel(str[left]))
        {
            left++;
            continue;
        }
        //查询瑕疵度是否正确
        std::string newString = str.substr(left, right - left+1);
        if (GetDefectDeep(newString) != deep)
        {
            //从左往右
            for (int i = left; i <= right; i++)
            {
                newString = str.substr(i, right - i + 1);
                if (IsVowel(newString[0]) &&  GetDefectDeep(newString) == deep && right - i +1> max)
                {
                    max = right - i+1;
                }
            }
            //从右往左
            for (int i = right; i >= left; i--)
            {
                newString = str.substr(left, i - left + 1);
                if (IsVowel(newString[0]) &&  GetDefectDeep(newString) == deep && i - left +1 > max)
                {
                    max = i - left+1;
                }
            }
            right--;
            left++;
        }
        else
        {
            if (right - left > max)
            {
                max = right - left;
            }
            break;
        }
    }
    return max;
}

测试代码

写了两个测试函数,一个用来调试单个案例,另一个全面验证

//单个测试,一般用来调试代码
void DebugTest()
{
    std::string str = "aabeebuu";
    int deep = 1;

    int result=GetMaxVowelStringLenght(str, deep);
    std::cout << result << std::endl;     //预期结果为   aabee  eebuu
}

//全量测试,输入不同的案例,测试代码质量
void FullTest()
{
    std::string str1 = "aabeebuu";
    int deep1 = 1;
    int result = GetMaxVowelStringLenght(str1, deep1);
    std::cout << result << std::endl;     //预期结果为5  aabee eebuu

    str1= "asdbuiodevauufgh";
    deep1 = 0;
    result = GetMaxVowelStringLenght(str1, deep1);   //满足最长元音字符子串有2个  uio   auu 长度为3
    std::cout << result << std::endl;

    str1 = "aeueo";
    deep1 = 2;
    result = GetMaxVowelStringLenght(str1, deep1);   //0
    std::cout << result << std::endl;
}

主函数

void main()
{
    //DebugTest();
    FullTest();
}

结果

华为OD2024 E 文章被收录于专栏

实时更新华为2024 E卷答案

全部评论

相关推荐

全志一面(技术面)面试时间:30分钟左右面试形式:视频面试1、让我自我介绍2、问我成绩,为啥研究成绩一般了?3、讲项目4、讲项目难点5、问了我一个跨时钟域的问题,100M时钟跨越到5M时钟,数据流,使用fifo,这样在5M时钟域会不会是duobit同时变化?格雷码的作用?6、问我静态时序分析?如果setup违例了应该怎么做?除了优化关键路径外?还可以怎么做?7、低功耗设计?设计人员可以做的低功耗设计本质上是尽量降低时钟频率的翻转。2、问了一个题,关于定点数加法的问题。全志二面(HR面)面试时间:18分钟左右面试形式:视频面试1、自我介绍2、怎么选一个公司3、你手头有什么公司的offer,4、你的期望薪资多少5、全志在你的第一梯队吗,你为什么想来全志6、还有什么想问的全志科技2025届秋季校园招聘正式启动韶华向远,征途可期💫一起设计芯片去,共同创造新未来与我们联系,开启一切可能快来投递简历吧全志科技成立于2007年,是卓越的智能应用处理器SoC、高性能模拟器件和无线互联芯片设计厂商。总部位于中国珠海,在&nbsp;深圳、西安、上海、成都、横琴、广州、香港等地设有研发中心或分支机构,2015年于深交所创业板上市。【招聘岗位】芯片设计类,芯片验证类,芯片制造类,系统设计类,米哈游、算法、软件、硬件、产品多个岗位招聘中📍【工作地点】珠海、西安、深圳、广州投递方式:【内推链接】https://app.mokahr.com/campus-recruitment/allwinnertech/43436?recommendCode=DS935fNW#/jobs【内推码】DS935fNW(内推简历优先筛选~)大家投递完可以在评论区打上姓名缩写+岗位,我来确认有没有内推成功喽
全志科技
|
校招
|
13个岗位
点赞 评论 收藏
分享
面经:1,上来就有一个英文自我介绍,说的稀碎2,让我用中文介绍了读研期间的机械臂项目,并问了ros,相机标定,坐标系转换,算法设计动机,在里面承担什么角色等项目相关的问题3,让我介绍第二个java项目,kafak怎么用的4,为何选择天津和联想(表忠心的时候到了!!!)5,对这个岗位的了解,然后给我介绍了一下岗位,我恩恩啊啊表示很感兴趣(继续发力表忠心)6,找工作看重什么?我说一是行业和我个人的发展,二是和生活的平衡,不要加班太严重,要有双休。面试官表示联想工作氛围还是很好的,更像一个外企(doge)7,反问,还有下一轮面试吗----------------分界线----------------听说写面经会增大面试通过成功的概率,冲冲冲啊----------------分界线----------------&nbsp;收到二面通知&nbsp;二面结束&nbsp;&nbsp;&nbsp;&nbsp;基本就是hr面主管面1,有英语问题,问你的优缺点。2,对城市的选择。3,对岗位的了解。4,对加班的理解。联想2025届校招正式启动啦!【校招项目】面向应届毕业生,岗位涉及各个业务部门;【全球管培生GFL项目】聚焦全球顶尖院校的高潜质应届生人才,通过轮岗机会/高管一对一指导/定制化培养/优厚的薪酬福利,助你快速提升能力,并致力培养成为联想业务管理者。申请此项目需提交英文简历。❗两个项目可同时投递,早投递早面试,各个专业均有合适的岗位【校招岗位】产品与项目、技术、市场与销售、职能、供应链、设计等【20+工作地点】北京、上海、深圳、天津、武汉、成都、广州、杭州、南京、厦门、长沙、郑州、济南、沈阳、哈尔滨、昆山、南宁、东京、莫里斯维尔等【投递链接】https://talent.lenovo.com.cn/home【内推码】XZLMCWC2025(简历优先筛选,后续有疑问或者流程问题欢迎随时联系)【内推入口】在“联想校招官网”投递校招职位,创建简历时“从哪儿获知招聘信息”选择“联想员工推荐”并且输入推荐人ITcode:XZLMCWC2025
联想
|
校招
|
超多精选岗位
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务