N诺刷题——字符串、排序、查找、链表

字符串类问题

1014加密算法

简单,过

1012字符移动

原做法
借助了两个字符串

#include<iostream>
#include <string>
#include<cstdlib>
using namespace std;
int main()
{
	string s1;
	cin>>s1;
	string s2=s1;
	string s3=s1;
	int len=s1.size();
	int cnt1=0;
	int cnt2=0;
	for(int i=0;i<len;i++)
	{
		if(s1[i]>='0'&&s1[i]<='9')//是数字
			s2[cnt1++]=s1[i];
		else
			s3[cnt2++]=s2[i];
	}
	s2=s2.substr(0,cnt1);
	s3=s3.substr(0,cnt2);
	s1=s3+s2;
	cout<<s1<<endl;
	system("pause");
	return 0;
}

改进1
对字符串运算的改进

#include<iostream>
#include <string>
#include<cstdlib>
using namespace std;
int main()
{
	string s1,s2="",s3="";
	cin>>s1;
	int len=s1.size();
	for(int i=0;i<len;i++)
	{
		if(s1[i]>='0'&&s1[i]<='9')//是数字
			s2+=s1[i];
		else
			s3+=s1[i];
	}
	cout<<s3<<s2<<endl;
	system("pause");
	return 0;
}

其实只需要在输出做手脚即可

#include<bits/stdc++.h>
using namespace std;
int main()
{
    /*题目并非要求改变字符串顺序,只需按照前非数字字符后数字字符输出即可*/
	string s;
	string number="";//数字字符串
	cin>>s;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]>='0'&&s[i]<='9')//数字字符,保存最后输出
			number+=s[i];
		else
			cout<<s[i];//非数字则直接输出
	}
	cout<<number;
	return 0;
}

1292

简单
注意数组初始化写法

#include<iostream>
#include <string>
#include<cstdlib>
using namespace std;
int main()
{
	string s;
	while(cin>>s)
	{
		int a[26]={0};
		int len=s.size();
		for(int i=0;i<len;i++)
			if(s[i]>='A'&&s[i]<='Z')
				a[s[i]-'A']++;
		for (int i=0;i<26;i++)
		{
			cout<<char('A'+i)<<":"<<a[i]<<endl;
		}
	}
	system("pause");
	return 0;
}

1240 首字母大写

缺了这两个导致编译不过
#include<string.h>
#include <stdio.h>

#include <bits/stdc++.h>
using namespace std;
int main()
{
	char s[105];
	while(gets(s))
	{
		int len=strlen(s);
		int flag=0;
		for(int i=0;i<len;i++)
		{
			if(flag==0&&s[i]>='a'&&s[i]<='z')
			{
				s[i]=s[i]-'a'+'A';
				flag=1;
			}
			else if(s[i]==' ')
				flag=0;
		}
		for(int i=0;i<len;i++)
			printf("%c",s[i]);
		printf("\n");
	}
	//system("pause");
	return 0;
}

1394统计单词

思路简单 过

1414

简单

1027 删除字符串

伪删除

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	cin>>s;
	int len=s.size();
	int a[100]={0};

	for(int i=0;i<len-2;i++)
		if(tolower(s[i])=='g'&&tolower(s[i+1])=='z'&&tolower(s[i+2])=='u')
		{
			a[i]=1;a[i+1]=1;a[i+2]=1;
		}

	for(int i=0;i<len;i++)
		if(a[i]==0)
			cout<<s[i];
	cout<<endl;
	//system("pause");
	return 0;
}

排序

一个sort打天下
注意:stable_sort

1151成绩排序

代码中的sort()使用很有参考意义
以及比较函数的写法

#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
using namespace std;

struct student
{
	string name;
	int gore;
}stu[2000];

bool compare1(student a,student b)//从大到小
{
	return a.gore>b.gore ;
}
bool compare2(student a,student b)//从小到大
{
	return a.gore <b.gore ;
}
int main()
{
	int n,way;
	cin>>n>>way;
	for(int i=0;i<n;i++)
	{
		cin>>stu[i].name;
		cin>>stu[i].gore;
	}
	if(way==0)
		stable_sort(stu,stu+n,compare1);
	else 
		stable_sort(stu,stu+n,compare2);
	for(int i=0;i<n;i++)
		cout<<stu[i].name <<" "<<stu[i].gore <<endl;
	system("pause");
	return 0;
}

1106

标记,很复杂 ,有时间再做

1159

直接在sort里面操作,主要还是比较函数的写法

1217

简单,直接过
需要注意的是c++中自带可以比较字符串,按照字典顺序输出

1227

还是sort
主要是对这个行怎么进行拆分
亦可只提取时间,最后比较完整个输出字符串

#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
using namespace std;
struct T
{
	string name;
	string time;
	string run;
}t[10000];
bool compare(T t1,T t2)
{
	if(t1.run ==t2.run )
		return t1.time<t2.time;
	else
		return t1.run<t2.run;
}

int main()
{
	string s;
	int cnt=0;
	while(getline(cin,s))
	{
		if(s=="") break;
		
		int len=s.size();
		int i=0,j=0;
		for(i=len-1;i>=1;i--)
		{
			if(s[i]!=' '&&s[i-1]==' ')
			{
				t[cnt].run=s.substr(i,len-i);//获取运行时间
				break;
			}
		}
		for(j=0;j<len-1;j++)
		{
			if(s[j]==' '&&s[j+1]!=' ')
			{
				t[cnt].name =s.substr(0,j+1);
				t[cnt].time=s.substr(j+1,i-j-1);
				break;
			}
		}
		cnt++;//统计个数
	}
	sort(t,t+cnt,compare);
	for (int k=0;k<cnt;k++)
	{
		cout<<t[k].name <<t[k].time <<t[k].run <<endl;
	}
	
	system("pause");
	return 0;
}

1248整数奇偶排序

简单

1254字符串排序

简单

1255 字符串排序

记录
sort函数的参数,字符串用字符串下标
有额外信息还是用结构体好,不要反复横跳

#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
using namespace std;
struct zifu
{
	char zi;
	int id;
}str[500];
bool compare(zifu a,zifu b)
{
	if(tolower(a.zi)==tolower(b.zi))
		return a.id<b.id;
	else
		return tolower(a.zi)<tolower(b.zi);
}

int main()
{
	string s;
	while(getline(cin,s))
	{
		string s1="";
		int len=s.size();
		int cnt=0;
		for(int i=0;i<len;i++)
			if(s[i]>='A'&&s[i]<='z')
			{
				str[cnt].zi=s[i];
				str[cnt].id =cnt;
				cnt++;
			}
		sort(str,str+cnt,compare);

		int j=0;
		for(int i=0;i<len;i++)
			if(s[i]>='A'&&s[i]<='z')
				s[i]=str[j++].zi ;

		cout<<s<<endl;
	}
	//system("pause");
	return 0;
}

1261字符串

后面使用getline 前面是cin 记得加getchar 消除回车

1294后缀子串排序

记录:
如果使用vector容器,则用这样写,不然编译老是错。
sort(s2.begin(),s2.end(),compare);
vector.end()指向的是最后一个元素的下一个位置
vector相关

#include <bits/stdc++.h>
using namespace std;
bool compare(string a,string b)
{
	return a<b;
}
int main()
{
	string s;
	string s2[1000];
	while(cin>>s)
	{
		int len=s.size();
		for(int i=0;i<len;i++)
		{
			string a=s.substr(i,len-i);
			s2[i]=a;
		}
		sort(s2,s2+len,compare);
		for (int i=0;i<len;i++)
			cout<<s2[i]<<endl;
	}
	return 0;
}

1338

和之前的排序题目一样,没意思

1360

简单

1399

sort秒杀

1400

特殊排序
简单

1404

简单 老一套

1412

大数排序
简单
秒杀

#include<bits/stdc++.h>
using namespace std;
int n;
string s[110];
bool cmp(string a, string b)
{
	if (a.length() == b.length())
		return a < b;
	else
		return a.length() < b.length();
}
int main() 
{
	while (cin >> n)
	{
		for (int i = 0; i < n; i++)
			cin >> s[i];
		sort(s, s + n, cmp);
		for (int i = 0; i < n; i++)
			cout << s[i] << endl;
	}
	return 0;
}

1310

思路简单,细节很多
记录:
奖牌去重的写法

#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
#include <vector>
using namespace std;
struct country
{
	int id;
	int jin;
	int yin;
	int jiang;
	int sum;
	float jin_rat;
	float jiang_rat;
	int flag;
	int pai[4];
	int paiming;
	int way;
}coun[1000];


bool compare_1(country a,country b)
{
	return a.jin>b.jin;
}
bool compare_2(country a,country b)
{
	return a.jiang>b.jiang;
}
bool compare_3(country a,country b)
{
	return a.jin_rat>b.jin_rat;
}
bool compare_4(country a,country b)
{
	return a.jiang_rat>b.jiang_rat;
}

int main()
{
	int n,m;
	while(cin>>n>>m)
	{
		int result[1000][3]={0};
		//输入
		for(int i=0;i<n;i++)
		{
			cin>>coun[i].jin ;
			cin>>coun[i].yin;
			cin>>coun[i].sum;
			coun[i].id=i;
			coun[i].flag=0;
			coun[i].jiang=coun[i].jin+coun[i].yin;
			coun[i].jin_rat =((float)coun[i].jin) /((float)coun[i].sum) ;
			coun[i].jiang_rat  =((float)coun[i].jiang)/((float)coun[i].sum) ;
		}
		for(int i=0;i<m;i++)
		{
			int temp=0;
			cin>>temp;
			coun[temp].flag=1;	
		}
		//按金牌排序
		int temp1=0;
		sort (coun,coun+n,compare_1);
		//记录排名
		for (int i=0;i<n;i++)
		{
			if (i!=0)
			{
				if(coun[i].jin!=coun[i-1].jin)
					temp1=i;
			}
			coun[i].pai[0]=temp1+1;
		}
		//奖牌排序
		int temp2=0;
		sort (coun,coun+n,compare_2);
		for (int i=0;i<n;i++)
		{
			if (i!=0)
			{
				if(coun[i].jiang!=coun[i-1].jiang)
					temp2=i;
			}
			coun[i].pai[1]=temp2+1;
		}
		//金牌比率
		int temp3=0;
		sort (coun,coun+n,compare_3);
		for (int i=0;i<n;i++)
		{
			if (i!=0)
			{
				if(coun[i].jin_rat!=coun[i-1].jin_rat)
					temp3=i;
			}
			coun[i].pai[2]=temp3+1;
		}
		//奖牌比率
		int temp4=0;
		sort (coun,coun+n,compare_4);
		for (int i=0;i<n;i++)
		{
			if (i!=0)
			{
				if(coun[i].jiang_rat!=coun[i-1].jiang_rat)
					temp4=i;
			}
			coun[i].pai[3]=temp4+1;
		}

		//选出最佳排名
		for(int i=0;i<n;i++)
		{
			int temp5=n+1;
			for(int j=0;j<4;j++)
			{
				if(coun[i].pai[j]<temp5)
				{
					temp5=coun[i].pai[j];
					coun[i].way=j+1;
					coun[i].paiming=temp5;
				}
			}
		}

		//输出需要排名的国家,首先重新标记
		for(int i=0;i<n;i++)
		{
			if(coun[i].flag ==1)
			{
				result[coun[i].id][0]=coun[i].paiming;
				result[coun[i].id][1]=coun[i].way;
				result[coun[i].id][2]=1;
			}
		}
		for(int i=0;i<n;i++)
			if(result[coun[i].id][2]==1)
				cout<<result[i][0]<<":"<<result[i][1]<<endl;
		cout<<endl;
	}
	//system("pause");
	return 0;
}

1387

用字符串函数 思路不难
记录
自己编译了好几次才过
主要是变量用混了,以后需要在草稿纸上写清变量等东西再编码
翻转这里
原先

		string s10=s.substr(0,begin);
		string s20=s.substr(begin,len);
		string s30=s.substr(begin+len,s.size()-begin-len);
		int len2=s20.size();
		for(int j=0;j<(len2/2);j++)
		{
			char temp=s20[j];
			s20[j]=s20[len2-j-1];
			s20[len2-j-1]=temp;
		}
	//	cout<<s20<<endl;
		s=s10+s20+s30;

修改为

		for(int i=begin;i<begin+len/2;i++)//翻转
		{
			char temp=s[i];
			s[i]=s[len-1-i+2*begin];
			s[len-1-i+2*begin]=temp;
		}

查找类问题

用map 超级好用

1476 1477 例题

#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
#include <vector>
#include <map>
using namespace std;
struct node
{
	string id;
	string name;
	string sex;
	int age;
};
int main()
{
	int n,q;
	map<string ,node>M;
	while(cin>>n)
	{
		for(int i=0;i<n;i++){
			node temp;
			cin>>temp.id >>temp.name>>temp.sex>>temp.age;
			M[temp.id]=temp;
		}
		cin>>q;
		for(int i=0;i<q;i++)
		{
			string flag;
			cin>>flag;
			if(M.find(flag)!=M.end())
				cout<<M[flag].id <<" "<<M[flag].name<<" "<<M[flag].sex<<" "<<M[flag].age<<endl;
			else 
				cout<<"No Answer!"<<endl;
		}
	}
	//system("pause");
	return 0;
}

1177

基础

#include <bits/stdc++.h>
using namespace std;
struct student
{
	int id;
	int book;
}a[300];
int main()
{
	int n,q;
	while(cin>>n>>q)
	{
		map<int ,int>M;
		for(int i=0;i<n;i++)
		{
			a[i].id=i;
			cin>>a[i].book;
			M[a[i].book]++;
		}
		for(int i=0;i<n;i++)
		{
			if(M[a[i].book]==1)
				cout<<"BeiJu"<<endl;
			else
				cout<<(M[a[i].book]-1)<<endl;
		}
	}
	//system("pause");
	return 0;
}

1388

连用MAP都不用,直接上数组
简单

1383

思路简单
记录:
大佬写法
其中的unique()去重
unique()–去重 (Ps:要先进行排序,保证重复元素相邻)
unique(A.begin(),A.end())
但是注意这里并没有删除元素,只是把元素移到了末尾
unique会把相邻重复元素全部丢到队列末尾,只留下一个在原队列
而且, unique() 的返回值就是被后置元素的“首地址”(迭代器)
记录2:
可用MAP去重

		if(M[x]==0){
			M[x]++;
			f[count++]=x;
		}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
	int n, m,temp;
	vector<int> a;
	cin >> n;
	for (int i = 0;i < n;i++) {
		cin >> temp;
		a.push_back(temp);
	}
	cin >> m;
	sort(a.begin(), a.end());
	a.erase(unique(a.begin(), a.end()), a.end());
	cout << a[m-1];
}

1478 喝饮料

注意的是数据定义为double这样方便
printf("%.3lf\n",cnt);

1307

简单

1347

先放着 难

链表

1081

循环链表的建立

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<stdio.h>
#include <queue>
#include <functional>
#include<algorithm>
using namespace std;
const int maxn=100+5;
int n,s,m;
struct node 
{
	int date;
	node *next;
};

//创建循环链表
struct node* creat()
{
	node *now ,*head,*pre;
	for(int i=1;i<=n;i++)
	{
		now=new node;
		if(i==1)
		{
			head=now;pre=now;
		}
		now->date =i;
		now->next=head;
		pre->next=now;
		pre=now;
	}
	return head;
}

void prin(struct node *head)
{
	struct node *pre,*p;
	p=head;
	while(s>1)
	{
		pre=p;
		p=p->next;
		s--;
	}
	int i=1;
	while(p!=NULL)
	{
		if(p==p->next)
		{
			cout<<p->date<<endl;break;
		}
		if(i%m==0)
		{
			cout<<p->date<<",";
			pre->next=p->next;
		}
		else
			pre=p;
		p=p->next;
		i++;
	}
}
int main()
{
	while(cin>>n>>s>>m)
	{
		if(n+s+m==0)break;
		struct node *head;
		head=creat ();
		prin(head);
	
	}
	return 0;
}

1015

创建链表后的排序
记录
之前一直跳出错误,主要是我头插法创建链表出错了
链表排序,直接交换数值即可

//头插法插入链表
	for(int i=0;i<5;i++)
	{
		struct node *now=new node;
		cin>>now->date ;
		now->next=head->next;
		head->next=now;
	}

1018

和签到题创建循环链表思想一致

1025

合并链表
之前老是内存溢出,故合并两个链表 ,第三个用指针就好,不要另外开辟空间

		//now=new node;
		if( head1->date >head2->date )
		{
			//now->date=head2->date;
			//tail->next=now;
			//tail=now;
			tail->next=head2;
			tail=tail->next;
			head2=head2->next;
		}

后面老是时间溢出,因为这个链表应该判断等于的情况,不然是等于的话,会一直循环直到时间溢出

		if( head1->date >=head2->date )
		{
			tail->next=head2;
			tail=tail->next;
			head2=head2->next;
		}

1405

同1015

1533

#include<cstdio>
#include <vector>
#include <string>
#include <string.h>
#include<iostream>
#include <queue>
#include<algorithm>
using namespace std;
const int maxn=100+5;
struct node
{
	int date;
	struct node *next;
};

//尾插法建立链表
struct node * creat(int n)
{
	struct node *head,*pre;
	for(int i=0;i<n;i++)
	{
		struct node *now=new node;
		if(i==0)
		{
			head=now;
			pre=now;
		}
		cin>>now->date;
		pre->next=now;
		pre=now;
	}
	pre->next=NULL;
	return head;
}

int main()
{
	int n;
	while(cin>>n)
	{
		struct node *head=creat(n);
		struct node *temp=head;
		
		while(temp->next)
		{
			int p=temp->date;
			temp->date=temp->next->date;
			temp->next->date=p;
			if(temp->next==NULL||temp->next->next==NULL)
				break;
			else
				temp=temp->next->next;
		}

		while(head)
		{
			cout<<head->date<<" ";
			head=head->next;
		}
		cout<<endl;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
链表字符串排序可以使用归并排序算法。 具体实现步骤如下: 1. 定义链表节点结构体,包含字符串和指向下一个节点的指针。 2. 定义归并排序函数,输入为链表的头指针,输出为排序后的链表头指针。 3. 在归并排序函数中,先对链表进行分割,直到链表只剩一个节点或为空。 4. 对分割后的链表进行归并,具体实现可以使用双指针法,依次比较两个链表节点的字符串大小,将较小的节点插入到新链表的尾部。 5. 最后返回新链表的头指针即可。 代码实现如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Node { char str[100]; struct Node* next; } Node; Node* merge(Node* l1, Node* l2) { Node* head = (Node*)malloc(sizeof(Node)); Node* cur = head; while (l1 && l2) { if (strcmp(l1->str, l2->str) < 0) { cur->next = l1; l1 = l1->next; } else { cur->next = l2; l2 = l2->next; } cur = cur->next; } cur->next = l1 ? l1 : l2; return head->next; } Node* sortList(Node* head) { if (!head || !head->next) { return head; } Node* slow = head; Node* fast = head->next; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; } Node* mid = slow->next; slow->next = NULL; Node* l1 = sortList(head); Node* l2 = sortList(mid); return merge(l1, l2); } int main() { Node* head = (Node*)malloc(sizeof(Node)); head->next = NULL; int n; printf("Input n: "); scanf("%d", &n); printf("Input strings: "); for (int i = 0; i < n; i++) { char s[100]; scanf("%s", s); Node* node = (Node*)malloc(sizeof(Node)); strcpy(node->str, s); node->next = NULL; Node* cur = head; while (cur->next && strcmp(s, cur->next->str) > 0) { cur = cur->next; } node->next = cur->next; cur->next = node; } head = sortList(head->next); printf("Sorted strings: "); Node* cur = head; while (cur) { printf("%s ", cur->str); cur = cur->next; } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王蒟蒻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值