前言
Python切片有着很广泛的应用尤其是算法里,就比如:
此时我定义了一个字符串str”woxihuanshenyu”
print(str[0:-1])#输出第一个到倒数第二个所有字符
print(str[2:5])#输出第三个到第五个字符
print(str[2:])#输出第三个往后的所有字符
此时输出:
这里以图片展示了
正文
那我们就可以知道负号是倒数的意思
那么我们将切片用于数组当中
我们简单引用OJ162http://acm.zzuli.edu.cn/problem.php?id=1162作为样例来讲述切片的用法(这里解释一下python的指针其实就是对象)另外OJ只要保证结果对就行 不一定要定义他们给的函数
我们先看要求:
答案:
下面八行代码就可以成功提交OJ
def f(a,n,k):
a=a[-k:]+a[:-k]
return a
n=int(input())
a=list(map(str,input().split()))
k=int(input())
a=f(a,n,k)
print(*a)
输出结果:
怎么样,也不用调用任何库,简便吧,下面拓展为大家解释切片和改动一些代码让我们更能理解
先比较一下C和C++代码:
C和C++的代码均引用网上的(非本人编写)
下面是C语言代码来源:https://blog.csdn.net/vivi_cin/article/details/104936834
#include<stdio.h>
#include<stdlib.h>
// 逆序操作函数
void reverse(int *a,int l,int r){
int i,j,t;
for(i=l;i<=r;i++){
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
// 循环移位函数
void ringShift(int *a, int n, int k){
// 循环移动后的数值仍然存入数组a中
// 右移动 右边k为分割线
int i;
// 将数组a的前半部分逆序
reverse(a,0,n-k-1);
// 将数组a的后半部分逆序
reverse(a,n-k,n-1);
// 将整个数组a逆序
reverse(a,0,n-1);
// 打印移位后的数组a的元素
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int main(){
int n,i,*a,k;
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*(n+1));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&k);
ringShift(a,n,k);
return 0;
}
下面是C++代码:来源https://codeantenna.com/a/VCnT18ST1g
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
void ringShift(int *a, int n, int k);
int main(){
int n, k, i;
cin >> n;
int* a = (int *)malloc(sizeof(int)*n);
for (i = 0; i < n; i++)
cin >> *(a + i);
cin >> k;
ringShift(a, n, k);
return 0;
}
void ringShift(int *a, int n, int k){
int* b = (int *)malloc(sizeof(int)*n);
int i;
for (i = 0; i < k; i++){
b[i] = a[n - k + i];
}
int c = 0;
for (i = k; i < n; i++){
b[i] = a[c++];
}
for (i = 0; i < n; i++){
printf("%d ", b[i]);
}
}
可以看出很麻烦,以前我能看下去,但是自从我学了python之后就看不下去了(
拓展
下面是为方便大家理解Python切片,为此代码添加了注释
a[-k:] 就是最后k个元素 a[:-k]就是除了最后k个元素让后重新赋值给a *a就是以数组形式输出
# 定义循环移动函数
def ringShift(a, n, k):
# 使用切片操作实现循环移动
a = a[-k:] + a[:-k] # -k表示从右边数第k个元素,-k:表示从右边数第k个元素到末尾的切片
return a
# 读入n
n = int(input())
# 读入n个整数,转换为列表
a = list(map(int, input().split()))
# 读入k
k = int(input())
# 调用循环移动函数
a = ringShift(a, n, k)
# 输出移动后的数组,用空格隔开
print(*a)
对于为什么输出的是*a 因为此时*a作为一个单独的对象输出,如果你去掉*那么就会输出一整个数组
问:我是强迫症,可以不用*a输出么?
答:可以
用enumerate函数也可以达到相同效果
代码3:
def f(a,n,k):
a=a[-k:]+a[:-k]
return a
n=int(input())
a=list(map(str,input().split()))
k=int(input())
a=f(a,n,k)
# 用enumerate函数遍历列表a,同时得到索引和元素
for x, val in enumerate(a):
# 只打印元素,不打印索引
print(val,end=' ')
这样提交上去也是对的
切片还有更为广泛的用法,不仅仅是ACM还有网安方面,希望大家看完能多去锻炼一下,也希望能和大家一同学习.
- 最新
- 最热
只看作者