周期串问题

问题描述:

如果一个字符串可以由某个长度为k的字符串重复多次得到,则该串以k为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过80的串,输出它的最小周期。

原型:
    int GetMinPeriod(char *string);

输入参数:
    char * string:字符串。

返回值:
    int 字符串最小周期。

样例输入:abcabcabc

样例输出:3

问题分析:

该编程题没有相关算法和比较复杂的编程语言的考察,是最基本的编程基础问题。

方法一:没有用任何算法和编程语言特性,就是对其逻辑用编程实现,最终对相关测试用例还是不行。以失败告终。

int GetMinPeriod(char * inputstring)  //一开始自己写的,还是有些问题
{
	int num=1,temp1,temp2=0;
	char *s1;
	s1=inputstring; 
	s1++;
	while(*s1!='\0')    //没有用任何算法和语言特性,就是对其逻辑用编程实现
	{

		while((*s1!=*inputstring)&&(*s1!='\0'))
		{
			s1++;
			num++;
		}
		if(*s1=='\0')
			return 0;
		temp1=num;
		while(*s1==*inputstring && *s1!='\0')    
		{
			s1++;
			inputstring++;
			temp1--;
			temp2++;
			if(temp1==0 && *s1=='\0')
				return num;
		}
		inputstring=inputstring-temp2;
		num=num+temp2;
		temp2=0;
	}
	return 0;
}
方法二:(参考相关代码)求最小周期的经典方法,是在字符串的长度范围内遍历的

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

int GetMinPeriod(char *inputstring)
{
   int len=0;
  char *p=inputstring;
  while(*p++)
  	len++;    //求inputstring的长度
  for(int i=1;i<=len;i++)   //外层循环用于遍历字符串长度,求最小周期
  {  
      int flag=1;
      if(len%i!=0)    //简化计算量,字符串的最小周期一定能整除整个字符串的长度 
      	continue;
      else
      {
		  for(int j=0;j<len-i;j++)   //第j个字符与第j+i个字符进行比较,故j<l-i.
          {
			  if(inputstring[j]!=inputstring[j+i])
              {
                  flag=0;
				  break;
              }
          }
      }
      if(flag==1)
      {
          return i;
      }
  }
  return len;
}
void main()
{
	char *s;
	s=(char *)malloc(100);
	int num;
	printf("please input string:\n");
	scanf("%s",s);
	num=GetMinPeriod(s);
	printf("%d\n",num);
}

这个编程还有点小问题,如样例输入abc,输出为3。按照最小周期的定义,输出应该为0(这种非周期字符串测试用例应该是不会存在的吧?)。但是华为OJ的测试用例都过了。这点不是很明白。

### 关于周期的定义与计算 #### 定义 周期是指由一系列具有固定时间间隔或重复模式的时间单元组成的序列。这种概念广泛应用于信号处理、通信系统以及计算机体系结构等领域。具体来说,周期可以被看作是由若干个基本周期组成的一个整体,其特性可以通过分析这些基本周期之间的关系来描述。 在一个典型的场景下,如果存在一组连续的操作,每项操作都对应着一定的时序需求(例如时钟周期、机器周期或指令周期),那么整个过程就可以视为一种周期[^1]。 #### 计算方法 要计算周期的整体周期长度,需考虑以下几个方面: 1. **最小单位——时钟周期** 如前所述,时钟周期是构成任何复杂周期的基础单元。假设系统的主频为 \( f \),则单一时钟周期可表示为: \[ T_{\text{clock}} = \frac{1}{f} \] 2. **机器周期与指令周期的关系** 对于某些简单指令而言,仅需占用单一机器周期即可完成全部工作流程;而对于较为复杂的指令类型,则可能涉及多个机器周期才能达成目标功能[^2]。因此,在评估某一特定任务所需总耗时时,应当综合考量其所关联的所有独立阶段所耗费的具体数量级及其对应的持续时间段数。 3. **累加各组成部分的时间开销** 当明确了各个子环节分别占据多少比例之后,便可依次叠加起来得到最终结果。比如当某个程序片段包含 n 条不同类型的语句,并且已知它们各自所需的平均执行次数 k_i 及相应花费 t_i (i=1,...,n), 那么总体运行时间T即满足如下表达式: ```python total_time = sum([k * t for k, t in zip(k_list, t_list)]) ``` 通过以上步骤便能够有效地估算出任意给定条件下完整的周期表现形式及相关参数指标。 ```python def calculate_cycle_string_period(clock_frequency, instruction_cycles): """ Calculate the period of a cycle string based on clock frequency and list of instructions' cycles. Args: clock_frequency (float): System's main frequency in Hz. instruction_cycles (list[int]): List containing number of machine cycles per each instruction. Returns: float: Total time required to execute all provided instructions as part of one full 'cycle-string'. """ clock_period = 1 / clock_frequency # Assuming every element represents single-machine-cycle duration equivalent value already multiplied by respective counts etc... return sum(instruction_cycles) * clock_period # Example usage: frequency = 10e6 # MHz converted into standard SI unit hertz instructions_data = [1]*8 + [2]*4 # Eight simple ops followed by four complex ones requiring double mcycles apiece resultant_duration = calculate_cycle_string_period(frequency, instructions_data) print(f"The calculated overall execution span amounts approximately {round(resultant_duration*1e9)} nanoseconds.") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值