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

找位置

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;//最后补上最后一次出现的位置
        }
    }
}


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

相关推荐

服从性笔试吗,发这么多笔,现在还在发。
蟑螂恶霸zZ:傻 x 公司,发两次笔试,两次部门匹配挂,
投递金山WPS等公司10个岗位 >
点赞 评论 收藏
分享
11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
26 5 评论
分享
牛客网
牛客企业服务