经典左旋,指针面试题

简介: 文章介绍了两种C语言实现字符串左旋的方法,以及如何使用C语言对整数数组进行奇偶数排序。通过实例演示了如何使用函数reverse_part和leftRound,以及在swap_arr中实现数组元素的重新排列。

今天给大家带来几道面试题

实现一个函数,可以左旋字符串中的k个字符。
例如:

ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

我们可以先自己自行思考,下面是参考答案:

方法一:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void reverse_part(char* str, int start, int end) //将字符串从start到end这一段逆序
{
  int i, j;
  char tmp;
 
  for (i = start, j = end; i < j; i++, j--)
  {
    tmp = str[i];
    str[i] = str[j];
    str[j] = tmp;
  }
}
 
void leftRound(char* src, int n)
{
  int len = strlen(src);
  reverse_part(src, 0, n ); //逆序前段
  reverse_part(src, n+1, len - 1); //逆序后段
  reverse_part(src, 0, len - 1); //整体逆序
}
 
 
int main()
{
  char str[] = "abcdfghijk";
  int n = 0;
  printf("左旋几位?\n");
  scanf("%d", &n);
  printf("原来字符串\n");
  printf("%s", str);
 
  leftRound(str, n-1);
  printf("\n左旋%d位后的字符串\n",n);
  printf("%s", str);
 
 
 
  return 0;
}
 


具体思路:

我们先创建一个倒序字符串的函数,具体是要将字符串分别进行倒叙后,才能得到左旋字符串。

即:先将左旋前部分倒叙,再将后半部分进行倒叙,最后将整个字符串进行倒叙。即可得到左旋n

位的字符串。



方法二:

 
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>void leftRound(char* src, int n)
{
  int len = strlen(src);
   
  char tmp[256] = { 0 }; //更准确的话可以选择malloc len + 1个字节的空间来做这个tmp
 
  strcpy(tmp, src + n); //先将后面的全部拷过来
  strncat(tmp, src, n); //然后将前面几个接上
  strcpy(src, tmp); //最后拷回去
}
 
 
 
 
 
 
 
 
 
 
 
int main()
{
  char str[] = "abcdfghijk";
  int n = 0;
  printf("左旋几位?\n");
  scanf("%d", &n);
  printf("原来字符串\n");
  printf("%s", str);
 
  leftRound(str, n);
  printf("\n左旋%d位后的字符串\n",n);
  printf("%s", str);
 
 
 
  return 0;
}
 


具体思路:


这个方法则是运用了字符串函数进行左旋,首先先将n位后的元素拷贝到tem中,然后再将n位元素也拷贝到tem中,此时tem中已经是完成左旋的字符串,最后将tem再拷贝到初始数组中即可。这个需要形成一个辅组空间进行储存,好让字符串可以拷贝和连接。


缺点:需要创建一个辅助空间,来协助代码的完成。

题目:
输入一个整数数组,实现一个函数,

来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,
所有偶数位于数组的后半部分。


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
 
void swap_arr(int arr[], int sz)
{
  int left = 0;
  int right = sz - 1;
  int tmp = 0;
 
 
  while (left < right)
  {
    // 从前往后,找到一个偶数,找到后停止
    while ((left < right) && (arr[left] % 2 == 1))
    {
      left++;
    }
 
    // 从后往前找,找一个奇数,找到后停止
    while ((left < right) && (arr[right] % 2 == 0))
    {
      right--;
    }
 
    // 如果偶数和奇数都找到,交换这两个数据的位置
    // 然后继续找,直到两个指针相遇
    if (left < right)
    {
      tmp = arr[left];
      arr[left] = arr[right];
      arr[right] = tmp;
    }
  }
}
 
int main()
{
  int arr[] = { 37,57,2,4,40,32,44,33,55,68 };
  int sz = sizeof(arr) / sizeof(arr[3]);
 
  printf("原数组排序\n");
  for (int i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
  swap_arr(arr, sz);
  printf("排序完后的数组\n");
  for (int i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);
  }
 
 
  return 0;
}
 


具体思路:

1. 给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置

2. 循环进行一下操作

a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环

b. left从前往后找,找到一个偶数后停止

c. right从后往前找,找到一个奇数后停止

d. 如果left和right都找到了对应的数据,则交换,继续往下找。

思维题

大家观察下方代码,觉得打印的是什么呢?

#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

好了公布答案:   >.


首先我们要知道C语言中,0为假,非0即为真。


全局变量,没有给初始值时,编译其会默认将其初始化为0。


i的初始值为0,i 结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该是 <,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该为  >.


好了今天的文章到这!

目录
相关文章
|
5月前
|
C++
C/C++工程师面试题(指针篇)
C/C++工程师面试题(指针篇)
87 0
|
5月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
5月前
C面试总结-指针与引用
C面试总结-指针与引用
34 0
|
11月前
|
算法 Go
单链表(面试算法题2)---单链表进阶1之快慢指针
单链表(面试算法题2)---单链表进阶1之快慢指针
43 0
|
11月前
|
编译器 C++
【C++】几道关于this指针的面试题
【C++】几道关于this指针的面试题
57 0
|
7天前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
5月前
|
Java Go
Golang深入浅出之-Go语言指针面试必知:理解与使用指针
【4月更文挑战第21天】Go语言中的指针允许直接操作内存,常用于高效数据共享和传递。本文介绍了指针的基础知识,如声明、初始化和解引用,以及作为函数参数使用。此外,讨论了`new()`与`make()`的区别和内存逃逸分析。在结构体上下文中,指针用于减少复制开销和直接修改对象。理解指针与内存管理、结构体的关系及常见易错点,对于面试和编写高性能Go代码至关重要。
71 2
|
5月前
|
编解码 缓存 安全
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
77 1
|
5月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
5月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
73 1