for (int i = k; i < 9; i++) {
arr[i] = arr[i + 1];
}
从下标为k的元素开始,逐个将下一个往前移,下标为k的被覆盖。
如需完整可执行程序请评论说明
解题思路:
拿到一组字符串之后,我们首先设置一个临时变量,存放字符串中的第一个字符。
然后把字符串中的其余字符通过循环依次前移一位,最后再把临时变量的值赋给字符串的最后的一位。
以上是字符串的一次左旋,要左旋几次就可以通过循环重复以上过程几次就可以了。
图解如下所示:
程序源码:
#include<iostream>
#include<assert.h>
#include<stdio.h>
#include<Windows.h>
using namespace std;
void string_reverse(char* arr, int len){
assert(arr);
assert(len > 0);
char temp;
temp = arr[0];
for (int i = 0; i < len - 1; ++i){
arr[i] = arr[i + 1];
}
arr[len - 1] = temp;
}
void Print(char* arr, int len){
for (int i = 0; i < len; ++i){
cout << arr[i] << " ";
}
cout << endl;
}
void test(){
char arr[] = { 'A', 'B', 'C', 'D', '1', '2', '3', '4' };
//这里用数组来表示字符串,如果用字符串来表示字符串会产生一个错误
//char *arr = "ABCD1234";
int count = 0;
int len = 0;
len = sizeof(arr) / sizeof(arr[0]);
//len = strlen(arr);
Print(arr, len);
cout << "请输入要左旋的次数:>" << endl;
cin >> count;
count %= len;
while (count--){
string_reverse(arr, len);
}
Print(arr, len);
}
int main(){
test();
system("pause");
return 0;
}
程序运行结果:
【注意】
如果向程序中所标注的直接用字符串来表示的话,会造成以下后果:
原因:
我们先来看一个内存分配示意图:
假如现在执行以下代码:
int a,b,c,d;
a=0;
b=1;
c=2;
d=3;
则a的地址最高,d的地址最低,因为这是一个压栈的过程。
但是如果执行以下语句的话:
char arr[] = { 'A', 'B', 'C', 'D', '1', '2', '3', '4' };
内存分配如图所示:
这时我们可以发现数组内存放的数据的地址是依次增加的,也就是说开始的元素地址最小,结束的元素地址最大。这是为什么呢?
原来数组在申请内存的时候不是为他的元素一个个申请内存,而是一次性的把数组所需要的内存申请好,再依次存放数组元素。
而如果我们在代码中用的是以字符串的形式的话,就会造成问题了:
char *arr = "ABCD1234";
我会解决该问题。
解题思路: 1. 用户指定删除的下标k; 2. 把第k+1个元素到最后一个元素逐次向前移动,即 从a[k+1]开始到a[9],把每个元素向前都移动一位,变成a[k]到a[8]; 3. 再输出 a[0]到a[8]的元素。
代码如下:
#include<stdio.h>
int main(){
int a[10], i, k;
printf("请向数组中输入数据:\n");
for(i=0; i<10; i++){
scanf("%d", &a[i]);
}
printf("请输入要删除的下标k:\n");
scanf("%d", &k);
for(i=k; i<9; i++){
a[i] = a[i+1];
}
printf("删除k后的数组为:\n");
for(i=0; i<9; i++){
printf("%d,", a[i]);
}
// 注意最后一个元素后没有逗号
printf("%d", a[i]);
return 0;
}
供参考:
#include <stdio.h>
#define N 10
int main()
{
int a[N], n, i, k;
scanf("%d", &n); // 输入数组长度
for (i = 0; i < n; i++) // 输入数组元素
scanf("%d", &a[i]);
do {
printf("输入待删除元素下标(0 =< k < %d):",n);
scanf("%d", &k); //输入待删除元素下标
} while (k < 0 || k > n - 1);
for (i = k; i < n - 1; i++)//删除下标为 k 的元素
a[i] = a[i + 1];
n--;
for (i = 0; i < n; i++)//输出删除元素后的数组
printf("%d ", a[i]);
return 0;
}