题解 | #找位置#巧妙解决输出格式问题

找位置

http://www.nowcoder.com/practice/e3b2cc44aa9b4851bdca89dd79c53150

问题分析:

这个问题难就难在如何判断当前是否是最后一个出现的,因为输出格式有要求。最后一个的输出格式跟前面的不同,
那么我们可以转换一下思路,假设每次找到重复的值,每次只输出上一次出现的位置,并用tmp保存当前位置,
那么最后一次出现的位置就不会被输出出来,然后判断tmp是否==i,不等说明重复值最后一个没有输出,然后按最
后出现位置的输出格式补上就行了。
复杂度分析:
时间复杂度O(n2):因为每个元素都遍历了该元素后面的所有元素。
空间复杂度O(1):只定义了几个变量。

优化思路:

因为字符串形式是确定的,那么我们可以利用map来做,只是我已经忘了map的一些基础格式和函数调用。
完全可以直接遍历一遍字符串,每次让str[i]的值作为key,保存其位置i,如果当前map里没有key就加入,否则直接在key后面加入i。
那么因为map没有改变字符出现的相对位置,只要key关键字后面的长度>=2,就说明有重复,输出就行了。
这样时间复杂度为O(n)。实在是已经忘了map的一些基础用法,只知道个大概。
这样做的空间复杂度其实也不高,最大也就是O(n)。对于字符串特别长的完全有必要这么做。
#include <string>
#include <iostream>
using namespace std;
int main() {
    string str;
    while(cin>>str) {
        int tmp;
        for(int i=0;i<str.size();++i) {
            if(str[i]=='*') continue;
            tmp=i;
            for(int k=i+1;k<str.size();++k){
                if(str[i]==str[k]) {
                    str[k]='*';
                    cout<<str[i]<<":"<<tmp<<",";//每次只输出上一个出现的位置
                    tmp=k;
                }
            }
            if(tmp!=i) cout<<str[i]<<":"<<tmp<<endl;//最后补上最后一次出现的位置
        }
    }
}


全部评论
tmp !=i是啥意思
1 回复 分享
发布于 2023-01-30 14:46 江苏
妙啊!多谢大佬
1 回复 分享
发布于 2022-03-02 17:00
牛的, 输出上一个
点赞 回复 分享
发布于 02-12 08:49 内蒙古
同样思路 但是卡了好长时间才调试好做出来 呜呜呜呜呜
点赞 回复 分享
发布于 2024-08-15 12:15 安徽
这个tmp用的太妙了,学到了!感谢大佬分享
点赞 回复 分享
发布于 2022-03-10 09:53

相关推荐

VirtualBool:都去逗他了?
点赞 评论 收藏
分享
喜欢疯狂星期四的猫头鹰在研究求职打法:短作业优先
点赞 评论 收藏
分享
评论
31
5
分享

创作者周榜

更多
牛客网
牛客企业服务