Passage Section Converter

/**************************************************************/
/* bobo                                                       */
/* 20230212                                                   */
/* English Passage Section Inverter                           */
/**************************************************************/


/* Includes */


#include <stdio.h>
#include <string.h>
#include <stdbool.h>


/* Defines */
#define SIZE_PASSAGE    1000
#define SIZE_WORD       20
#define NUM_WORD        (SIZE_PASSAGE / SIZE_WORD)
#define FLAG_INCOMPLETE 0
#define FLAG_COMPLETE   1
#define FLAG_ERROR      2
#define FLAG_START_NEG  0
#define FLAG_START_POS  1


/* Structures */
typedef struct {
	int order;
	char word[SIZE_WORD];
	int start;
	int end;
} passage_word_t;


/* Prototypes */
int passage_word_init(passage_word_t*, int);
int passage_word_divide(passage_word_t*, int, char*, int);
int passage_word_generate(char*, char*, passage_word_t*, int, int, int);

/* Globals */


/* Main Function*/


int main() {
	/* Exploere the C World */

	/* Variables */
	char in_char_passage[SIZE_PASSAGE] = { 0 }, out_char_passage[SIZE_PASSAGE] = { 0 };
	int in_int_invert_stt = 0, in_int_invert_stp = 0, indx_word = 0;
	passage_word_t inter_struct_words[NUM_WORD] = { 0 };


	/* Step 01. Input */
	/* Step 01.01. Fetch Input */
	fgets(in_char_passage, SIZE_PASSAGE, stdin);
	scanf_s("%d", &in_int_invert_stt);
	scanf_s("%d", &in_int_invert_stp);


	/* Step 02. Process */
	/* Step 02.01. Divide input string to words*/
	passage_word_divide(inter_struct_words, NUM_WORD, in_char_passage, SIZE_PASSAGE);
	/* Step 02.02. Determine word order */
	/* Step 02.03. Gnerate new sentence */
	//strcpy_s(out_char_passage, sizeof(out_char_passage), in_char_passage);
	passage_word_generate(out_char_passage, in_char_passage, inter_struct_words, \
		NUM_WORD, in_int_invert_stt, in_int_invert_stp);


	/* Step 03. Output */
	/*
	 * fputs(out_char_passage, stdout);
	 */
	printf("%s", out_char_passage);
	/*
	 * printf("%d \n", in_int_invert_stt);
	 * printf("%d \n", in_int_invert_stp);
	 */
	/* 
	for (indx_word = 0; indx_word < NUM_WORD; indx_word++) {
		if (inter_struct_words[indx_word].start != inter_struct_words[indx_word].end) {
			printf("%s \n", inter_struct_words[indx_word].word);
		}
		else {
		}
	}
	*/
	/* Step 03.01. Output */


	/* Return */
	return 0;
}


/* Function Implementation */

/* Initialize */
int 
passage_word_init(passage_word_t* in_arr_word, int in_num_word) {
	/* Variables */
	int index_word = 0;
	int index_element = 0;

	/* Initialize */
	for (index_word = 0; index_word < in_num_word; index_word++) {
		in_arr_word->order = index_word;
		in_arr_word->start = 0;
		in_arr_word->end = 0;
		for (index_element = 0; index_element < SIZE_WORD; index_element++) {
			in_arr_word->word[index_element] = '\0';
		}
	}

	/* Return */
	return 0;
}

/* Divide */
int 
passage_word_divide(passage_word_t* out_arr_word, int in_size_arr, char* in_str_passage, \
	int in_num_char)
{
	/* Variables */
	/* psg = passage, wd = word */
	int index_psg_char = 0, index_wd = 0, index_wd_char = 0, num_wd_char = 0, sts_return = 0;
	bool flag_stt = false;

	/* Check character */
	for (index_psg_char = 0; index_psg_char < in_num_char; index_psg_char++) {
		if (in_str_passage[index_psg_char] != ' ' && in_str_passage[index_psg_char] != '\0' \
			&& in_str_passage[index_psg_char] != '\n') {
			/* Not space, analyze */
			if (flag_stt == true) {
				continue;
			}
			else {
				out_arr_word[index_wd].order = index_wd;
				out_arr_word[index_wd].start = index_psg_char;
				flag_stt = true;
			}
		}
		else {
			/* Space, analyse */
			if (flag_stt == false) {
				continue;
			}
			else {
				/* End - start = 1 if a word is 1-character-long */
				out_arr_word[index_wd].end = index_psg_char;
				num_wd_char = out_arr_word[index_wd].end - out_arr_word[index_wd].start;
				if (num_wd_char > SIZE_WORD) {
					/* Word length out of range */
					sts_return = FLAG_ERROR;
					break;
				}
				else {
					/* Do nothing */
				}
				for (index_wd_char = 0; index_wd_char < num_wd_char; index_wd_char++) {
					out_arr_word[index_wd].word[index_wd_char] = in_str_passage[\
						out_arr_word[index_wd].start + index_wd_char];
				}
				index_wd++;
				flag_stt = false;
			}
		}
	}

	return sts_return;
}

/* Generate */
int passage_word_generate(char* out_passage, char* in_passage, passage_word_t* in_word, \
	int in_word_num, int in_word_order_stt, int in_word_order_stp) {
	/* Variables */
	/* psg = passage, wd = word */
	int index_wd = 0, index_word_taken = 0, num_wd_valid = 0, index_wd_char = 0, size_wd = 0;
	int index_psg_wd_out = 0, index_psg_wd_in = 0;
	int index_wd_stt = 0, index_wd_stp = 0, index_wd_swap = 0;

	/* Process */

	/* Determine the number of words */
	for (index_wd = 0; index_wd < in_word_num; index_wd++) {
		if (in_word[index_wd].start != in_word[index_wd].end) {
			num_wd_valid++;
		}
		else {
			/* Do nothing */
		}
	}
	index_wd_stt = in_word_order_stt;
	index_wd_stp = in_word_order_stp;

	/* Error process */
	if (index_wd_stt > num_wd_valid - 1) {
		/* Error */
		index_wd_stt = num_wd_valid - 1;
	}
	else {
	}
	if (index_wd_stp > num_wd_valid - 1) {
		/* Error */
		index_wd_stp = num_wd_valid - 1;
	}
	else {
	}
	if (index_wd_stt > index_wd_stp) {
		index_wd_swap = index_wd_stt;
		index_wd_stt = index_wd_stp;
		index_wd_stp = index_wd_swap;
	}
	else {
	}

	/* Determine order */
	for (index_wd = 0; index_wd < num_wd_valid; index_wd++) {
		if (index_wd < index_wd_stt || index_wd > index_wd_stp) {
			/* Normal output */
			index_word_taken = index_wd;
			size_wd = in_word[index_word_taken].end - in_word[index_word_taken].start;
			index_psg_wd_in = in_word[index_word_taken].start;
			for (index_wd_char = 0; index_wd_char < size_wd; index_wd_char++) {
				out_passage[index_psg_wd_out] = in_passage[index_psg_wd_in];
				index_psg_wd_out++;
				index_psg_wd_in++;
			}
		}
		else {
			/* Invert order */
			index_word_taken = index_wd_stt + index_wd_stp - index_wd;
			size_wd = in_word[index_word_taken].end - in_word[index_word_taken].start;
			index_psg_wd_in = in_word[index_word_taken].start;
			for (index_wd_char = 0; index_wd_char < size_wd; index_wd_char++) {
				out_passage[index_psg_wd_out] = in_passage[index_psg_wd_in];
				index_psg_wd_out++;
				index_psg_wd_in++;
			}
		}
		if (index_wd == num_wd_valid - 1) {
			/* Do not add space here */
		}
		else {
			/* Add space here */
			out_passage[index_psg_wd_out] = ' ';
			index_psg_wd_out++;
		}
	}

	/* Return */
	return 0;
}

/* End of File */

全部评论
写程序还要是越简洁越好哦~
点赞 回复 分享
发布于 2023-03-05 17:26 湖南
大佬六翻了
点赞 回复 分享
发布于 2023-02-13 10:42 四川
谢谢大佬的思路
点赞 回复 分享
发布于 2023-02-13 10:24 上海

相关推荐

上周组里招人,我面了六个候选人,回来跟同事吃饭的时候聊起一个让我挺感慨的现象。前三个候选人,算法题写得都不错。第一道二分查找,五分钟之内给出解法,边界条件也处理得干净。第二道动态规划,状态转移方程写对了,空间复杂度也优化了一版。我翻他们的简历,力扣刷题量都在300以上。后三个呢,就有点参差不齐了。有的边界条件没处理好,有的直接说这道题没刷过能不能换个思路讲讲。其中有一个女生,我印象特别深——她拿到题之后没有马上写,而是先问我:“面试官,我能先跟你确认一下我对题目的理解吗?”然后她把自己的思路讲了一遍,虽然最后代码写得不是最优解,但整个沟通过程非常顺畅。这个女生的代码不是最优的,但当我问她“如果这里是线上环境,你会怎么设计’的时候,她给我讲了一套完整的方案——异常怎么处理、日志怎么打、怎么平滑发布。她对这是之前在实习的时候踩过的坑。”我在想LeetCode到底在筛选什么?我自己的经历可能有点代表性。我当年校招的时候,也是刷了三百多道题才敢去面试。那时候大家都刷,你不刷就过不了笔试关。后来工作了,前三年基本没再打开过力扣。真正干活的时候,没人让你写反转链表,也没人让你手撕红黑树。更多的是:这个接口为什么慢了、那个服务为什么OOM了、线上数据对不上了得排查一下。所以后来我当面试官,慢慢调整了自己的评判标准。算法题我还会出,但目的变了。我出算法题,不是想看你能不能背出最优解。而是想看你拿到一个陌生问题的时候,是怎么思考的。你会先理清题意吗?你会主动问边界条件吗?你想不出来的时候会怎么办?你写出来的代码,变量命名乱不乱、结构清不清楚?这些才是工作中真正用得到的能力。LeetCode是一个工具,不是目的。它帮你熟悉数据结构和常见算法思路,这没问题。但如果你刷了三百道题,却说不清楚自己的项目解决了什么问题、遇到了什么困难、你是怎么解决的,那这三百道题可能真的白刷了。所以还要不要刷LeetCode?要刷,但别只刷题。刷题的时候,多问自己几个为什么:为什么用这个数据结构?为什么这个解法比那个好?如果换个条件,解法还成立吗?把刷题当成锻炼思维的方式,而不是背答案的任务。毕竟面试官想看到的,从来不是一台背题机器,而是一个能解决问题的人。
牛客51274894...:意思是光刷力扣还不够卷
AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
10
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务