• 提取不重复的整数


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

    for example:  If you input  9876673,the coumputer gives 37689.

    我想到啦两种方法,一种是从字符串的角度,一种是从整数的角度!

    从整数的角度:

    我刚开始时的做法:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int n;
     6     int a[100]={0};
     7     while(cin>>n)
     8     {
     9         int count=0;
    10         while(n)
    11         {
    12             a[n%10]=1;
    13             count++;
    14             n/=10;
    15         }
    16         for(int i=0;i<100;i++)
    17         {
    18             if(a[i]==1) cout<<i;
    19         }
    20         cout<<endl;
    21     }
    22     return 0;
    23 }// 结果是有所错误滴!

    该如何优化嘞:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n;
    	while(cin>>n)
    	{
    		int a[10]={0};
    		while(n)
    		{
    			a[n%10]++:
    			if(a[n%10]==1) cout<<n%10;  //颇有些逆的思想!由值寻下标!
    			n/=10;
    		}
    		cout<<endl;
    	}
    	return 0;
    }
    

     关于整数角度的另一种优化方法:

     1 链接:https://www.nowcoder.com/questionTerminal/253986e66d114d378ae8de2e6c4577c1
     2 来源:牛客网
     3 
     4 #include<iostream>
     5 using namespace std;
     6 int main()
     7 {
     8     int n;
     9     int a[10]={0};
    10     int num=0;
    11     cin>>n ;
    12     while(n)
    13     {
    14         if(a[n%10]==0)
    15         {
    16             a[n%10]++;//这一步是更新,遇到下次相同的数会跳过
    17             num=num*10+n%10;
    18         }
    19         n/=10;
    20     }
    21      
    22     cout<<num<<endl;
    23      
    24     return 0;
    25 }

    关于从字符串的角度:
    我一开始时的思绪停滞于此:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	string s;
    	while(cin>>s)
    	{
    		int len=s.size();
    		for(int i=len-1;i>=0;i--)
    		{
    			for(int j=len-1;j<i,j--)
    			{
    				if(s)
    			}
    		}
    	}
    }
    

      发现一些美丽的做法:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	string s;
    	int len,i;
    	int a[10]={0};
    	cin.getline(s);
    	len=s.size();
    	for(i=len-1;i>=0;i--)
    	{
    		if(a[s[i]-'0']==0)   // 
    		{
    			cout<<s[i];
    			a[s[i]-'0']++;
    		}
    	}
    	return 0;
    } 

    关于数字字符的一些补充:

    运用字符串库函数中的find()函数:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     string s;
     6     string s1=" ";    //抬头有双字符串在天空飞翔!
     7     cin>>s;
     8     for(int i=s.length();i>=0;i--)
     9     {
    10         if(s1.find(s[i])==string::npos)  //此为何意!且待细品!
    11             s1+=s[i];
    12     }
    13     cout<<s1<<endl;
    14     return 0;
    15 }

     运用这种模板这种思路这种方法可以迅速地解决下面这个问题:

    字符个数统计:

    编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	string s,s1=" ";
    	int count=0;
    	while(cin>>s)
    	{
    		for(int i=s.size()-1;i>=0;i--)
    		{
    			if(s1.find(s[i])==string::npos)
    			{
    				s1+=s[i];
    				count++;
    			}
    		}
    		cout<<count<<endl;
    	}
    	return 0;
    }
    

    Also: 更加恣意自由之思考做法!

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	string s;
    	while(cin>>s)
    	{
    		int k=0;
    		for(int i=0;i<=127;i++)
    		{
    			if(s.find(i)!=-1) k++;
    			cout<<k<<endl;
    		}
    	}
    	return 0;
    }
    

      

     当然运用集合(元素互异性)这一种数据结构可以更好的从一种角度解决问题来嘞!

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     char c;
     6     set<char> s;
     7     while(cin>>s)
     8     {
     9         if(c>=0&&c<=127)
    10              s.insert(c);
    11     }
    12     cout<<s.size()<<endl;
    13 }

    使用map来嘞:

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	map<char,int> mp;
    	char c;
    	while(cin>>c)
    	{
    		mp[c]++;
    	}
    	cout<<mp.size()<<endl; //任他云卷云舒,我自闲庭阔步之感!
    	return 0;
    }
    

    有个关于int的小话题叙述于此:

    int型的数到底最大值是多少? int占32位的时候,最大可以赋值为:2147483647。也就是0x7fffffff。也就是十位数字!

    详细讨论可见该篇blog.

    2019/7/19 重新翻阅这篇博客,再来补充一下关于find_last_of()的一些字符串相关的查找函数的叙述。

    Functions:

    1.find_first_of和find_last_of函数进行简单的匹配

    例如:在字符串中查找单个字符c。

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        string s;
        cin>>s;
        int pos1=s.find_first_of('a',0);  //下标是从0开始的。
        int pos2=s.find_first_of('a');
        int pos3=s.find_last_of('a');
        cout<<pos1<<" "<<pos2<<endl;
        return 0;
    }

    对啦:size_t是一种数据相关的无符号类型,它被设计得足够大以便能够内存中任意对象的大小在C++中,设计 size_t 就是为了适应多个平台的 。size_t的引入增强了程序在不同平台上的可移植性。

    在需要通过数组下标来访问数组时,通常建议将下标定义size_t类型,因为一般来说在进行下标访问时,下标都是正的。当然,也不是所有的下标访问操作下标都是正的。

    精辟的论述:

    关于指针的大小,网上描述基本上是千篇一律,认为指针是存放地址的,如果是32位机器就是4字节的,如果是64位机器就是8字节的,根据机器字而决定的。

    这里的32位机器和64位机器指的是什么呢?我觉的CPU的架构决定了机器的类型,如果CPU是x86架构,那么就是32位的CPU,当然并非所有的x86架构的CPU都是32位的,比如intel的8086和8088就是16位的CPU。

    如果CPU是x86-64的架构,那么就是64位的CPU。CPU的位数是由其字长决定,字长表示CPU在同一时间中能够处理二进制数的位数叫字长。字长是由CPU中寄存器的位数决定的,并非由数据总线的宽度决定的,只是数据总线的宽度一般与CPU的位数相一致。

    系统的位数是依赖于CPU的位数,即32位的CPU不能装64位的系统,但是现在(2015年)的CPU基本上都是x86-64的CPU,都支持64位的系统。但是正如上面的讨论,如果编译生成的程序不是64位的,那么指针的大小依然是4个字节。

    所以这个语句一点都不冲突啦:

    size_t found = str.find_first_of(';');  //找到第一个';'的位置 使用size_t可能会提高代码的可移植性、有效性或者可读性,或许同时提高这三者。

    参考blog:https://blog.csdn.net/Richard__Ting/article/details/79433814

     Further on the exploration of strings:
    npos是一个常数,表示size_t的最大值(Maximum value for size_t)。许多容器都提供这个东西,用来表示不存在的位置,类型一般是std::container_type::size_type。

    find函数在找不到指定值得情况下会返回string::npos。

    举例如下(计算字符串中含有的不同字符的个数):

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	string s;
    	getline(cin,s);
    	int count=0;
    	for(int i=0;i<=127;i++)
    	{
    		if(s.find(i)!=string::npos) count++;
    	}
    	cout<<count<<endl;
    }
    

      

  • 相关阅读:
    查找代码中的中文
    C# 清除cookies
    C# 32位程序在64位系统下注册表操作
    C# 32位程序在64位系统下运行中解决重定向问题
    C# 把一个文件夹下所有文件删除
    C# 把一个文件夹下所有文件复制到另一个文件夹下
    chromium浏览器开发系列第五篇:Debugging with WinDBG
    chromium浏览器开发系列第四篇:如何调试最新chromium源码
    chromium浏览器开发系列第三篇:chromium源码目录结构
    chromium浏览器高级开发系列第二篇:如何编译最新chromium源码
  • 原文地址:https://www.cnblogs.com/dragondragon/p/11194655.html
Copyright © 2020-2023  润新知