2014华为机试-字符串替换

题目要求:输入一个字符串,然后在输入一个整数,就是替换字符串的次数,然后依次输入需要替换的字符串……

例如:

输入:asdfghjasdfghj

           3

           as->bnm

           df->qwe

           gh->yui

输出:bnmqweyuijbnmqweyuij

意思就是,将输入的字符串中,as替换成bnm,df替换成qwe,gh替换成yui,总共替换三次,注意次数是不限定的,可以是任意整数等。

如果输入的次数是2,举例说明:

输入:asdfgasdfg

           2

           as->bn

           df->yuio

输出:bnyuiogbnyuiog

做完这道题,感觉自己把自己坑了,选择了用C语言,其实学过Java的同学随便都可以用几行代码实现,耗掉自己很多时间。

程序实现如下:

/*
** Replace String
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SUCCESS		0
#define FAILED		-1
#define MAXLINE		48
#define NOTFOUND	-1

int GetNumber(void)
{
	char temp;
	int count;
	count = 0;

	temp = getchar();
	while(temp >= '0' && temp <= '9')
	{
		count = count * 10 + (temp - 0x30);
		temp = getchar();
	}
	return count;
}

void GetString(char buff[])
{
	char temp;
	int i;
	i = 0;

	temp = getchar();
	while (temp != '\n')
	{
		buff[i++] = temp;
		temp = getchar();
	}
	buff[i] = '\0';
}

int FindString(int begin, char str1[], char str2[])
{
	int i, j;
	int MAXSIZE = strlen(str2);
	i = begin;
	while (str1[i] != '\0')
	{
		for (j = 0; j < MAXSIZE; j++)
		{
			if (str1[i++] == str2[j])
				continue;
			else break;
		}
		if (j == MAXSIZE)
			return (i - j);
	}
	return NOTFOUND;
}

int myStrcpy(char dest[], char src[])
{
	int i = 0;

	while (src[i] != '\0')
	{
		dest[i] = src[i];
		i++;
	}
	dest[i] = '\0';
	return SUCCESS;
}

void StringSplite(char *pBuff, char target[], char repStr[])
{
	int i = 0, j = 0;
	while(*(pBuff + i) != '-')
	{
		target[i] = *(pBuff + i);
		i++;
	}
	target[i] = '\0';

	while (*(pBuff + i) == '-' || *(pBuff + i) == '>')
		i++;

	while (*(pBuff + i) != '\0')
	{
		repStr[j++] = *(pBuff + i);
		i++;
	}
	repStr[j] = '\0';
}

void ReplaceString(char dest[], char src[], char repStr[])
{
	char temp[MAXLINE] = {'\0'};
	int Swidth, Rwidth;
	int begin = 0, iPos = 0;
	int i = 0;

	Swidth = strlen(src);
	Rwidth = strlen(repStr);

	while (dest[i] != '\0')
	{
		iPos = FindString(begin, dest, src);
		if (iPos != NOTFOUND)
		{
			myStrcpy(temp, dest + iPos + Swidth);
			myStrcpy(dest + iPos, repStr);
			myStrcpy(dest + iPos + Rwidth, temp);

			memset(temp, 0, MAXLINE);
			begin = iPos + Rwidth;
			i = begin;
		}
		else
			break;
	}
}

int main(void)
{
	char **pChar = NULL;
	char inData[48] = {'\0'};
	char target[10] = {'\0'};
	char repStr[10] = {'\0'};
	int i, sum;

	GetString(inData);
	fflush(stdin);
	sum = GetNumber();

	pChar = (char **) malloc(sum * sizeof(char *));
	if (pChar == NULL)
	{
		printf("Malloc memory for pChar has faild!\n");
		return 0;
	}
	for (i =0; i < sum; i++)
	{
		*(pChar + i) = (char *) malloc(MAXLINE * sizeof(char));
		if (*(pChar + i) == NULL)
		{
			printf("Malloc memory for *(pChar + %d) has faild!\n", i);
			return 0;
		}
	}

	for (i = 0; i < sum; i++)
	{
		fflush(stdin);
		GetString(*(pChar + i));
	}

	for (i = 0; i < sum; i++)
	{
		memset(target, 0, sizeof(target));
		memset(repStr, 0, sizeof(repStr));
		StringSplite(*(pChar + i), target, repStr);
		ReplaceString(inData, target, repStr);
	}
	printf("%s\n", inData);

	for (i = 0; i < sum; i++)
		free(*(pChar + i));
	free(pChar);
	return 0;
}



运行结果如下:



Java程序解决字符串替换太简单,程序如下:

package kvm;

import java.util.Scanner;

public class ReplaceStr {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int i, num = 0;
		String regStr = "->";
		String[] temp = new String[2];
		Scanner in = new Scanner(System.in);
		String oriStr = in.nextLine();
		String intStr = in.nextLine();
		num = Integer.parseInt(intStr);
		if (num <= 0) {
			System.out.println(oriStr);
			in.close();
			return;
		}
		
		String[] repStr = new String[num];
		for (i = 0; i < num; i++)
			repStr[i] = in.nextLine();
		for (i = 0; i < num; i++) {
			temp = repStr[i].split(regStr);
			oriStr = oriStr.replace(temp[0], temp[1]);
		}
		System.out.println(oriStr);
		in.close();
	}

}

运行结果如下:





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值