小陈的开学第四周程序

这篇博客记录了博主小陈在Vjudge和PTA平台上进行的链表相关编程练习,包括链表的连接与断开、链表操作、建立学生信息链表、统计专业人数、链表逆置、两个有序链表的合并、链表去重以及按固定长度反转链表等题目。小陈在解题过程中遇到了一些困难,通过不断尝试和学习最终完成了题目,分享了自己的解题思路和代码实现。
摘要由CSDN通过智能技术生成

一、Vjudge

1.Connection and Disconnection

题意

Given is a string S. Let T be the concatenation of K copies of S. We can repeatedly perform the following operation: choose a character in T and replace it with a different character. Find the minimum number of operations required to satisfy the following condition: any two adjacent characters in T are different.

输入

Input is given from Standard Input in the following format:
S
K

  1. 1≤|S|≤100
  2. S consists of lowercase English letters.
  3. 1≤K≤10^9
  4. K is an integer.

输出

Print the minimum number of operations required.

样例输入

issii
2

样例输出

4

T is issiiissii. For example, we can rewrite it into ispiqisyhi, and now any two adjacent characters are different.

解题思路

就是给你一段字符串,重复k次后求最少改几个字符,让它两边的字符与它不同,写的时候要注意所有字符一样和头尾字符一样的情况。
这道题真的是气死我了,到最后都没写出来,就差最后一个测试点,第二天又补了好几次,最后还是看题解写出来的,我到现在还是不知道我的写法哪里错了,气死了。

程序代码:(WA)

#include<bits/stdc++.h>
using namespace std;
int main(){
   
	string s1;
	getline(cin,s1);
	long long k;
	cin>>k;
	if(s1.length()==1){
   
		cout<<k/2<<endl;
		return 0;
	}
	
	int flag=1;
	int len=s1.length();
	for(int i=1;i<len;i++){
   
		if(s1[i]!=s1[i-1]){
   
			flag=0;
			break;
		}
	}
	if(flag){
   
		cout<<len*k/2<<endl;
		return 0;
	}
	
	//ababababa ababababa  5 4
	//7 6
	long long cnt=0;
	for(int i=1;i<s1.length();i++){
   
		if(s1[i]==s1[i-1])
			cnt++,i++;
	}
	long long cnt1=0;
	string s2=s1+s1;
	for(int i=1;i<s2.length();i++){
   
		if(s2[i]==s2[i-1])
			cnt1++,i++;
	}
	
//	if(s1[0]==s1[s1.length()-1]){
   
//		flag=1;
//	}else{
   
//		flag=0;
//	}
	
//	cout<<cnt<<" "<<cnt1<<endl;
//	cout<<k/2<<endl;
	if(cnt==(cnt1-cnt)){
   
		cout<<cnt*k<<endl;
	}	
	else{
   
//		if(flag){
   
			if(k%2==0)
				cout<<cnt1*(k/2)+(cnt1-cnt)*(k/2-1)<<endl;
			else
				cout<<cnt+(cnt1-cnt)*(k-1)<<endl;
//		}else{
   
//			if(k%2==0)
//				cout<<cnt1*(k/2)<<endl;
//			else
//				cout<<(cnt1-cnt)+cnt1*(k/2)<<endl;
//		}
		
	}
	return 0;
}

程序代码:(AC)

#include<bits/stdc++.h>
using namespace std;
int main(){
   
	string s1;
	getline(cin,s1);
	long long k;
	cin>>k;
	if(s1.length()==1){
   
		cout<<k/2<<endl;
		return 0;
	}
	
	int flag=1;
	int len=s1.length();
	for(int i=1;i<len;i++){
   
		if(s1[i]!=s1[i-1]){
   
			flag=0;
			break;
		}
	}
	if(flag){
   
		cout<<len*k/2<<endl;
		return 0;
	}
	
	long long cnt=0;
	for(int i=1;i<s1.length();i++){
   
		if(s1[i]==s1[i-1])
			cnt++,i++;
	}
	
	if(s1[0]==s1[s1.length()-1]){
   
		flag=1;
	}else{
   
		flag=0;
	}
	if(flag){
   
		int a=1,b=1;
		for(int i=1;i<s1.length();i++){
   
			if(s1[i]!=s1[i-1]) break;
			a++;
		}
		for(int i=s1.length()-2;i>=0;i--){
   
			if(s1[i]!=s1[i+1]) break;
			b++;
		}
		cout<<cnt*k-((a/2+b/2)-(a+b)/2)*(k-1)<<endl;
	}else{
   
		cout<<cnt*k<<endl;
	}
	return 0;
}

二、PTA

1.求链式表的表长

题意

本题要求实现一个函数,求链式表的表长。

裁判测试程序样例

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct LNode *PtrToLNode;
struct LNode {
   
    ElementType Data;
    PtrToLNode Next;
};
typedef PtrToLNode List;

List Read(); /* 细节在此不表 */

int Length( List L );

int main()
{
   
    List L = Read();
    printf("%d\n", Length(L));
    return 0;
}

/* 你的代码将被嵌在这里 */

L是给定单链表,函数Length要返回链式表的长度。

样例输入

1 3 4 5 2 -1

样例输出

5

解题思路

其实只用一个个找下去就行了,刚开始我想的很复杂,又设了一个指针,重点是还写错了!!最后百度的,才发现原来这么简单。

程序代码

int Length(List L){
   
	int cnt=0;
    while(L!=NULL)
    {
   
        cnt++;
        L=L->Next;
    }
	return cnt;
}
2.链式表操作集

题意

本题要求实现链式表的操作集。

各个操作函数的定义

  1. Position Find( List L

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值