C语言--左旋字符/右旋字符实现及其判断

简介: C语言--左旋字符/右旋字符实现及其判断

1.题目解释

左旋就是把对应的左边的放到右边

例如ABCDEF左旋2个字符就是BCDEFAB,左旋3个字符就是DEFABC;

2.代码实现

void leftmove(char* str, int k)
{
  int j = 0;
  assert(str);
  for (j = 0; j < k; j++)
  {
    char temp = *str;
    int len = strlen(str);
    int i = 0;
    for (i = 0; i < len - 1; i++)
    {
      *(str + i) = *(str + i + 1);
    }
    *(str + len - 1) = temp;
  }
}
int main()
{
  char arr[] = "abcdefgh";
  int k = 0;
  scanf("%d", &k);
  leftmove(arr, k);
  printf("%s\n", arr); 
  return 0;
}

(1)这个的逻辑就是把每符合条件的一个字符都向前移动

(2)把这个开始的字符拷贝一份,等到所有的全部前移之后在把这份拷贝放到最后,循环进行

3.代码优化

//这个优化了刚才的算法,因为刚才的算法可能让某一些元素
 //进行多次的移动,降低了代码的执行效率
void reverse(char* left, char* right)
{
  while (left < right)
  {
    char temp = *left;
    *left = *right;
    *right = temp;
    left++;
    right--;
  }
}
void leftmove(char* str, int k)
{
  int len = strlen(str);
  //左边逆序
  reverse(str, str + k - 1);
  //右边逆序
  reverse(str + k, str + len - 1);
  //整体逆序
  reverse(str, str + len - 1);
}
int main()
{
  char arr[] = "abcdefgh";
  int k = 0;
  scanf("%d", &k);
  leftmove(arr, k);
  printf("%s\n", arr); 
  return 0;
}

(1)因为第一种里面靠后的efgh等需要多次移动,比较冗余,

(2)这种解决方法很巧妙,不容易想到,他的做法就是先把左旋的字符逆序,再把不需要左旋的

字符逆序,最后再把整体的字符逆序,经过验证发现可以得到我们想要的结果;

4.左旋的判断

判断一个字符串是不是另外的一个字符串左旋得到的

int isleftmove(char* str1, char* str2)
{
  int j = 0;
  assert(str1 && str2);
  int len = strlen(str1);
  for (j = 0; j < len; j++)
  {
    char temp = *str1;
    int i = 0;
    for (i = 0; i < len - 1; i++)
    {
      *(str1 + i) = *(str1 + i + 1);
    }
    *(str1 + len - 1) = temp;
    if (strcmp(str1, str2) == 0)
      return 1;
  }
  return 0;
}
int main()
{
  char arr1[] = "abcdefgh";
  char arr2[] = "efghabcd";
  int ret = isleftmove(arr1, arr2);
  if (ret == 1)
  {
    printf("yes\n");
  }
  else
  {
    printf("not\n");
  }
  return 0;
}

(1)这里调用库函数,把已知的字符串进行左旋,每进行一次都和另外的一个进行比较,调用

strcmp函数进行比较;

int isleftmove(char* str1, char* str2)
{
  int len1 = strlen(str1);
  int len2 = strlen(str2);
  if (len1 != len2)
  {
    return 0;
  }
  strncat(str1, str1, len1);
  if ((strstr(str1, str2) == NULL))
    return 0;
  else
    return 1;
}
int main()
{
  char arr1[30] = "abcdefgh";
  //放两次,就可以找到所有的符合条件的结果
  char arr2[] = "efghabcd";
  int ret = isleftmove(arr1, arr2);
  if (ret == 1)
  {
    printf("yes\n");
  }
  else
  {
    printf("not\n");
  }
  return 0;
}

(1)这是一种更加高效的解法,把一个字符串并排写两遍,就可以得到所有的可能情况

(2)先把str1变成2份子放到第一个数组里面,这里使用了strncat函数,然后使用strstr函数看看

在这个里面能不能找到str2字符串,返回空指针就无法找到,否则就可以找到,这样就不用循环;

相关文章
|
1月前
|
C语言
C语言字符(串)函数
C语言字符(串)函数
|
27天前
|
存储 安全 编译器
深入C语言库:字符与字符串函数模拟实现
深入C语言库:字符与字符串函数模拟实现
|
2月前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
1月前
|
C语言
C语言常见字符函数和字符串函数精讲
C语言常见字符函数和字符串函数精讲
|
2月前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
3月前
|
编译器 C语言
【C语言小知识】ctype.h系列的字符函数
【C语言小知识】ctype.h系列的字符函数
|
3月前
|
C语言
【C语言篇】字符和字符串以及内存函数详细介绍与模拟实现(下篇)
perror函数打印完参数部分的字符串后,再打印⼀个冒号和⼀个空格,再打印错误信息。
59 0
|
3月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
51 0
|
4月前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
53 0
【C语言】字符函数,字符串函数,内存函数
|
4月前
|
C语言
C语言5 字符输出函数和格式输出函数
C语言5 字符输出函数和格式输出函数
82 1