找到数组中第k大值的位置 ,字符串中单词替换

15 篇文章 0 订阅

找出数组中第K大小的数,输出数所在的位置。例如{2,4,3,4,7},第1大的数是7,位置在4。第2大,第3大的数是4,位置在1,3,则返回1和3都可以。

分析:考虑map:map<key,value> 自带对value去重和对key排序的功能,所以可以把位置下标放在value,把数组元素的值放在key。这样对key排序完,找到第k个值对应的下标就可以了。

#include<map>
#include<iostream>
#include<string>
using namespace std;
int findn(int *num,int len,unsiged int n);
int main()
{
 int array[9]={1,2,4,4,3,8,2,2,2};
  int len=9;
 unsigned k;
  cin>>k;
int addr=findn(array,len,k);
cout<<addr<<endl;
}
int findn(int *num,int len ,unsigned int n)
{
 map<int,int> ma;
int i=0;
int *p;
p=num;
int fl_num;
while(ma.size()!=k)
{
 ma[*(p+i)]=i;
i++;
}
map<int,int>::iterator it;
it=ma.begin();
fl_num=it->first;
for(i;i<len;i++)  此时i是从k+1开始的值,遍历剩下的值
{
 if(*(p+i))>fl_num)
  {
    ma[*(p+i)]=i;
   ma.erase(fl_num);
   it=ma.begin();
   fl_num=it->first;
  }
}
return it->second;
}
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;

int cmp1(int a, int b)
{
	return b<a;
}

//字符串分割函数
vector<int> split(string str, string pattern)
{
	string::size_type pos;
	vector<int> result;

	str += pattern;//扩展字符串以方便操作
	int size = str.size();

	for (int i = 0; i<size; i++)
	{
		pos = str.find(pattern, i);
		if (pos<size)
		{
			string s = str.substr(i, pos - i);
			int tmp = stoi(s);
			result.push_back(tmp);
			i = pos + pattern.size() - 1;
		}
	}
	return result;
}
int main1()
{
	string str;
	int pos;
	while (cin >> str >> pos)
	{
		vector<int> result = split(str, ",");
		vector<int> result_sort = result;
		sort(result_sort.begin(), result_sort.end(), cmp1);
		for (int i = 0; i < result.size(); i++)
		{
			if (result[i] == result_sort[pos-1])
			{
				cout << i+1 << endl;
				break;
			}
		}
	}
	system("pause");
	return 0;
}

找到第n大的数:

//利用快速排序的partition,经过一次partition后,数组被privot分成左右两部分,:S左和S右。当S左的元素个数等于k-1时,pivot就是所找的数,当S左小于k-1,所找的数位于S右中,同理,以此来缩小空间;
复杂度为:o(n)
#include<iostream>
using namespace std;
int partition(int a[],int i,int j)
{
int temp=a[i];
if(i<j)
{
 while(i<j)
    {// 从后向前找比选择轴值得点小的位置
        while(i<j&&a[j]>=temp)  j--;//求第K大时,按照从大到小排序,求第K小时,按照从小到大排序
        if(i<j) a[i]=a[j];
        while(i<j&&a[i]<temp) i++;
        if(i<j)   a[j]=a[i];
       }
        a[i]=temp;
    return i;
}
}
int search(int a[],int i,int j,int k)
{
    int m=partition(a,i,j);
    if(k==m-i+1)  return a[m];//正好找到第K个值在基准值右边的数都比支点大。如果此时基准值的下 
                                标为i, 那么这个基准值就是第(endIndex-i+1)大的数了。endIndex 
                                是最后一个数的下标。
    else if(k<m-i+1)
    {
        return search(a,i,m-1,k);
    }
    else{
            return search(a,m+1,j,k-(m-i+1));
        }
}
int main()
{
 int a[7]={1,3,9,5,6,8,2,4,8};
int k=3;
cout<<search(a,2,6,k);
}
 

题目描述: 输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开, 所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串 

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
    string src;
    string s,s1;
    while(getline(cin,src))
    {
        getline(cin,s);
        getline(cin,s1);
        int flag=src.find(s);
        while(flag!=string::npos)  find函数在找不到指定值得情况下会返回string::npos
        {
            if(flag+s.size()<src.size() && src[flag+s.size()]!=' ')//防止找到单词的一半
            {
                flag=src.find(s,flag+1);
                continue;
            }
            src.replace(flag,s.size(),s1);
            flag=src.find(s,flag+1);
        }
        cout<<src<<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值