zoukankan      html  css  js  c++  java
  • 提取不重复的整数

    1、题目描述

    输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

    输入描述:

    输入一个int型整数

    输出描述:

    按照从右向左的阅读顺序,返回一个不含重复数字的新的整数

    输入例子:

    9876673

    输出例子:

    37689

    2、程序

    方案一

    基本思路:初值设为0,然后读到和0相等的输出,然后基准值加1,即下一步与1比较相等输出,这样就避免了重复。

    #include<iostream>
    #include<string>
    
    using namespace std;
    
    int main(){
        int a[10]={0};
      //这里定义a作为比较值
    string str; getline(cin,str); int num = str.size();
    int i; for(i=num-1;i>=0;i--){ if(a[str[i]-'0']==0){
         //这里是string类型转化为int类型的简便方法,即字符减去字符'0'即可 cout<<str[i]; a[str[i]-'0']++; } } return 0; }

      

    方案二

    基本思路:借助容器进行操作。

    //set用来记录已经被我们记录了的不重复的数字
    //queue保证从后往前以此输出
    #include <iostream>
    #include <set>
    #include <queue>
    using namespace std;
    int main()
    {
        int n;
        cin>>n;
        set<int> temp;
        queue<int> res;
        while(n%10){
            if(temp.find(n%10)==temp.end()){
                res.push(n%10);
                temp.insert(n%10);
            }
            n/=10;
        }
        while(!res.empty()){
            cout<<res.front();
            res.pop();
        }
        return 0;
    }
    

      

    方案三

    基本思路:以上方案均适用于数字,不具有普遍性。直接以字符串形式输入,这样既适用于字符串,也适用于数字。利用容器进行操作,这里位置和数值对应关系,我们可以采用map容器。

    #include <iostream>
    #include <string>
    #include <map>
    #include <stdio.h>
    #include <algorithm>
    
    using namespace std;
    
    int main(){
    	string str;
    	
    	while(cin>>str)
    	//等待输入结束
        //当然,这一步可以采用getline()和for()循环替代,即getline(cin,str)获取输入,然后for(int i=0;i<str.length();i++)控制循环输入
    	{
    		map<char,int> map_input;
    		//直接将数字作为字符串输入,这样的方案较好
    		for(int i=str.size()-1;i>=0;i--){
    		//for(int i=str.length()-1;i>=0;i--)
    		//起始位置为str.size()-1而不是str.size(),终点是0而不是1,下标为size()的数值越界了(下标从0开始的)
    			if(map_input.find(str[i])!=map_input.end()){
    			//用find函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器
                            //把最后一个作为基准值进行比较,即key选取has.end()这一元素
    				map_input[str[i]]++;
    				//如果查找到与参考值相等的,则将该key对应的value加1
    			}
    			else{
    				map_input[str[i]]=1;
    				//没有与参考值相等的key,value均为1,我们值输出value值为1的key
    				cout<<str[i];	
    			}
    		}
    		cout<<endl;
    	}	
    }
    

      

    注意:

    (1)获取输入以及循环的基本操作:

    方法一:

    while(cin >> str){
        //处理函数
    }
    

    方法二:

    getline(cin,str);
    //获得输入并将输入的数值绑定到str变量
    for(int i=0;i<str.length();i++){
        //处理函数
    }

    (2)这里涉及到一个很重要的操作,即选择字符串中的某一些数据输出,这里不是所谓的删除操作,那样问题就复杂化了,我们可以转化为有条件的输出,例如:

                if(map_input.find(str[i]) != map_input.end())
                //把最后一个作为基准值进行比较,即key选取has.end()这一元素
                    map_input[str[i]]++;
                else
                {
                    map_input[str[i]] = 1;
                    cout<< str[i];
                }

    这里要求输出不重复的字符,则我们应该采取这样的思路:如果不是重复的字符则输出,重复的直接跳过。

  • 相关阅读:
    【原创】编程题练习:反转字符串中的单词
    【最近的学习安排】
    【转载】判断两个链表是否相交、一个链表是否有环
    获取字符串字节长度
    如何找到GridView里的控件,建立GridViewRow对象
    Flex和.NET协同开发利器FluorineFx Flex与.NET互操作
    两款基于Visual Studio开发Flex的插件
    Mysql:向信号量添加给定计数将导致其超出它的最大计数错误
    Sql Server数据库触发器实例
    国外一些知名ASP.Net开源CMS系统
  • 原文地址:https://www.cnblogs.com/yedushusheng/p/5519168.html
Copyright © 2011-2022 走看看