编程小练习 OJ题 04

修改字符串

给定一个字符串,当其中出现连续三个相同的小写字母时,将其变为这个字母的下一个字母,如果是z,则变为a,如 "aaac" 变为 “bc”。变换后,如果又出现了连续三个相同的小写字母,则继续变换。最终的输出的字符不含有连续三个相等的小写字母。

#include <stdlib.h>
#include <string.h>
#include <iostream>

int ChangeString(char *pInStr, char *pOutStr) {
	if (pInStr == 0 || pOutStr == 0)
		return -1;
	bool flag = true;
	char input[256];
	strcpy(input, pInStr);
	char *output = pOutStr;

	int len, i;
	while (flag) {
		len = (int) strlen(input);
		for (i = 0; i < len; ++i) {
			if (input[i] >= 'a' && input[i] <= 'z' && i <= len - 3) {
				if (input[i] == input[i + 1] && input[i] == input[i + 2]) {
					break;
				}
			}
		}
		if (i == len)
			flag = false;

		for (i = 0; i <= len;) {
			if (input[i] >= 'a' && input[i] <= 'z' && i <= len - 3) {
				if (input[i] == input[i + 1] && input[i] == input[i + 2]) {
					*output = input[i] + 1;
					if (*output == 'z' + 1) {
						*output = 'a';
					}
					++output;
					i += 3;
					continue;
				}
			}
			*output++ = input[i++];
		}
		*output = '\0';

		memset(input, 0, 256);
		strcpy(input, pOutStr);
		if (!flag)
			break;
		output = pOutStr;
		memset(output, 0, len);
	}
	return 0;
}

int main() {
	char *pIn = "jkds*^*(HKEEEklIdddjilzzzzzzabb";
	char pTest[200];
	ChangeString(pIn, pTest);
	std::cout<< pTest ;  // jkds*^*(HKEEEklIejilc
}

找出字符串中第一个出现次数最多的字符

找出给定字符串中第一个出现次数最多的字符。

#include <map>
bool FindChar(char* pInputString, char* pChar)
{
	if(pInputString == 0 || pChar == 0)
		return false;

	std::map<char,int> m;
	char *p = pInputString;
	while(*p) m[*p++] = 0;

	p = pInputString;
	while(*p) m[*p++]++;

	p = pInputString;
	*pChar = *pInputString;
	while(*p) {
		if( m[*p] > m[*pChar ] )
			*pChar = *p;
		++p;
	}
	return true;
}

整数反序

将一个整数反序,并按照指定格式输出。如-123,输出"-1 2 3"。

#include <stdlib.h>
#include <vector>

int ProcessX(int iInput, int& iNum, char * strRst, int& iOutput)
{
	if(iInput > 99999 || iInput < -99999 || strRst == 0)
		return -1;

	if(iInput == 0){
		iNum = 1;
		*strRst++ = '0';
		*strRst = '\0';
		iOutput = 0;
		return 0;
	}

	std::vector<int> ve;
	bool isNegative = false;
	if( iInput < 0 ) {
		isNegative = true;
		iInput *= -1;
	}
	while( iInput != 0 ){
		ve.push_back( iInput % 10 );
		iInput /= 10;
	}

	iNum = (int)ve.size();
	iOutput = 0;
	for(unsigned int i = 0; i < ve.size(); ++i){
		iOutput = iOutput*10 + ve[i];
	}

	if(isNegative) {
		iOutput *= -1;
		*strRst++ = '-';
	}
	for(int i = (int)ve.size()-1; i >= 0; --i){
		*strRst++ = ve[i] + '0';
		*strRst++ = ' ';
	}
	*(--strRst) = '\0';
	return 0;
}

字符串替换

字符串替换,注意成功返回值。

int ProcessString( char * strInput,char chSrc,char chDes ,char * strOutput)
{
	if(strInput == 0 || strOutput == 0) return -1;
	bool flag = false;
	while(*strInput){
		if(*strInput == chSrc){
			flag = true;
			*strOutput++ = chDes;
			strInput++;
			continue;
		}
		*strOutput++ = *strInput++;
	}
	*strOutput = '\0';
	if(flag)
		return 0;
	return -1;
}

找出升序数组中和为给定值的两个数字

给定一个升序数组,找出相加等于特定值的两个数字,任意两个即可。

bool FindTwoNumbersWithSum(int aData[], unsigned int uiLength, int sum, int *pNum1, int *pNum2)
{
	if( aData == 0) return false;

	unsigned i,j;
	i = 0;
	j = uiLength-1;
	int cal = 0;
	while(i < j){
		cal = aData[i] + aData[j];
		if( cal > sum){
			--j;
		}
		if( cal < sum){
			++i;
		}
		if ( cal == sum){
			*pNum1 = aData[i];
			*pNum2 = aData[j];
			return true;
		}
	}
	return false;
}
时间: 2024-10-22 04:23:41

编程小练习 OJ题 04的相关文章

编程小练习 OJ题 05

重复的电话号码 查找一个文件中重复的电话号码,所有的大小写字母按照手机九宫格映射到数字,其余字符不考虑,将重复的号码还原后升序输出到接口的文件中,号码小于12位. #include <stdlib.h> #include "PhoneBookProcess.h" #include <map> #include <string> #include <fstream> #include <iostream> #include &l

编程小练习 OJ题 06

一元多项式化简 对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式.如输入: "7X^4-5X^6+3X^3",输出: "-5X^6+7X^4+3X^3". #include <map> #include <string> #include <stdlib.h> #include <iostream> using namespace std; void OrderPolynomial (cha

计算概论(A)/基础编程练习1(8题):1:大象喝水

计算概论(A)/基础编程练习1(8题)/1:大象喝水 地址:http://pkuic.openjudge.cn/base1/1/ 1 #include<stdio.h> 2 int main() { 3 /* 圆周率常数 */ 4 const float Pi = 3.14159; 5 6 /* 深h厘米 半径r厘米 均为整数 */ 7 int h, r; 8 scanf("%d %d", &h, &r); 9 10 /* 一桶水的升数 1升 = 1000毫

四川大学线下编程比赛第三题:书本转移

好久没写过日志,也怪最近事情真的特别多,最近参加关于编程方面就是CSDN高校俱乐部举办的线下编程塞,说起这次编程赛,总共三道题,题目都可以在csdn高校俱乐部上看到,参加比赛的时候有点小紧张,第三题涉及到队列,当时的机器没有代码提示,坑...也怨自己平时写代码用惯了代码提示,很多stl的方法都是隐隐约约知道,但是具体的不知道,导致第三题没有做出来,遗憾哈!下面贴一下今天写的第三题的代码 题目 四川大学线下编程比赛第三题:书本转移 题目详情: 小强有 3 个箱子 A,B,C 用来装书,所有的书(一

计算概论(A)/基础编程练习2(8题)/7:整数的个数

1 #include<stdio.h> 2 int main() { 3 int k,temp,n[3] = {0}; 4 5 // 输入k个正整数 6 scanf("%d",&k); 7 8 // 循环读入和进行算术 9 while(scanf("%d",&temp)!=EOF) { 10 switch(temp) { 11 case 1: 12 n[0]++; 13 break; 14 case 5: 15 n[1]++; 16 br

计算概论(A)/基础编程练习2(8题)/5:点和正方形的关系

1 #include<stdio.h> 2 #include<math.h> 3 int main() { 4 // 输入坐标 5 float x, y; 6 while(scanf("%f %f", &x, &y) != EOF) { 7 // 计算坐标点与原点的欧氏距离 8 float dist=sqrt(x*x+y*y); 9 10 /* 11 // 简单判断横坐标和纵坐标的截距abs(x).abs(y)和与原点距离dist 注意:abs(

第五届在线编程大赛月赛第一题:完全平方数的个数

第五届在线编程大赛月赛第一题:完全平方数的个数 题目详情: 给定整数区间[A,B]问其中有多少个完全平方数. 输入格式: 多组数据,包含两个正整数A,B 1<=A<=B<=2000000000. 输出格式: 每组数据输出一行包含一个整数,表示闭区间[A,B]中包含的完全平方数的个数. 答题说明: 输入样例 1 1 1 2 3 10 3 3 输出样例: 1 1 2 0 java代码: import java.util.Scanner; public class One { public s

hadoop编程小技巧(4)---全局key排序类TotalOrderPartitioner

Hadoop代码测试版本:Hadoop2.4 原理:在进行MR程序之前对输入数据进行随机提取样本,把样本排序,然后在MR的中间过程Partition的时候使用这个样本排序的值进行分组数据,这样就可以达到全局排序的目的了. 难点:如果使用Hadoop提供的方法来实现全局排序,那么要求Mapper的输入.输出的key不变才可以,因为在源码InputSampler中提供的随机抽取的数据是输入数据最原始的key,如下代码(line:225): for (int i = 0; i < splitsToSa

计算概论(A)/基础编程练习2(8题)/1:求平均年龄

1 #include<stdio.h> 2 int main() { 3 // 声明与初始化 4 int n, count=1, s=0, age=0; 5 6 // 输入学生人数 7 scanf("%d", &n); 8 9 // 循环读入 加和 10 while(count<=n) { 11 scanf("%d",&age); 12 s+=age; 13 count++; 14 } 15 16 // 计算平均年龄输出 17 pr