左右移位字符串

C语言中关于字符串左右循环移位的问题 <br />   我们在C语言中常常碰到字符串循环左右移位的题型,下面对其进行详解:<br />    例如:有一组char的字符串:abcdefghijk 。你要循环左移3位变成ijkabcdefgh(也有写出ijkabcdefghi);或右移三位变成defghijkabc(也有写成cdefghijkabc);<br />   首先我们来解决字符串循环右移的问题:<br />方法一:利用已有的字符串函数。<br />#include<stdio.h><br />#include<string.h><br 阅读详情

问题:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。

方法1.思路:移位可以看成是字符串的翻转。
(1)将一个字符串abcdef分成两部分:X:abc, Y:def
(2)X/Y翻转:X->X^T,即abc->cba;Y->Y^T,即def->fed。得到cbafed。
(3)整个翻转:(X^TY^T)^T=YX,得到defabc。

解答:右移字符串
#include <stdio.h>
Reverse(char* arr,int b,int e){
    for(;b<e;b++,e--){
        int temp=arr[e];
        arr[e]=arr[b];
        arr[b]=temp;
        printf("%d: %s\n",b,arr);
    }
}

RightShift(char* arr,int N,int K){
    K%=N;  //因为有可能会出现K>N,这种情况下右移K-N次与右移K次的效果是相同的
    Reverse(arr,0,N-K-1);  //如果是左移,就写成Reverse(arr,0,K-1);
    Reverse(arr,N-K,N-1);  //Reverse(arr,K,N-1);
    Reverse(arr,0,N-1);
}

int main(){
    int N=0,K=0;
    char s[100];
//    memset(s,'0',sizeof(char)*100);
    scanf("%s%d",s,&K);
    N = strlen(s);
    RightShift(s,N,K);
    printf("%s\n",s);
    return 0;
}

方法2.还有一种方法,就是
1.将要移位的字符串存放在另外的数组p中;
2.将目的字符数组a中的字符进行移位;
3.将数组p中字符赋给数组a。
实现代码如下:
/*
 *Author:cbjust 
 *Date:2013-01-10 
 *
 */
#include <stdio.h>
#include <string.h>
//左移
void leftShift(char a[],int N,int K){
    int i;
    char p[1001];
    memset(p,'0',sizeof(p));
    //将数组a中要移位的字符串存放在数组p中
    for(i=0;i<K;i++){
      p[i] = a[i];
    }
    //将数组a中元素前移K个位置
    for(i=0;i<N-K;i++){
     a[i] = a[i+K];
    }
    //将数组p中元素赋值给数组a
    for(i=N-K;i<N;i++){
     a[i]=p[i-N+K];
    }
}

//右移
void rightShift(char a[],int N,int K){
    int i;
    char p[1001];
    memset(p,'0',sizeof(p));
    //将数组a中要移位的字符串存放在数组p中
    for(i=0;i<K;i++){
      p[i] = a[i+N-K];
    }
    //将数组a中元素后移K个位置
    for(i=0;i<N-K;i++){
     a[N-1-i] = a[N-1-i-K];
    }
    //将数组p中元素赋值给数组a
    for(i=0;i<K;i++){
     a[i]=p[i];
    }
}

int main(){
    char a[1001];
    int K,N;
    scanf("%s%d",a,&K);
    N = strlen(a);
//    leftShift(a,N,K);
//    printf("%s\n",a);
    rightShift(a,N,K);
    printf("%s\n",a);
    return 0;
}

方法2相比方法1,只是增加了数组p的开销~时间复杂度依然为O(n)

ABAP SHIFT-字符串移位 和 CONDENSE去除空格 ABAP SHIFT-字符串移位 阅读详情

相关推荐

字符串相关的算法整理

本文根据个人学习过程,积累一些常用知识。供后续参考学习。 字符串的相关的算法,一直是面试和项目中经常用到的。因此,在这里整理记录。字符串可以看成是字符类型的数组,因此可以将其和数组排序、数组查找和顺序调整有关的算法相结合。另外,字符串的比较和子字符串的操作,可以用来解决其他问题,比如一棵树是否和另一棵树的子树相匹配。 字符串操作包含很多基本知识点,如:回文的概念、字符匹配的问题、字典序问题、子

victor的博客 6050

移位运算+字符串连接+流程控制

** 移位运算 ** " >> ":右移运算符,将左操作数向右移动,移位个数由右操作数决定 " << ":左移运算符,将左操作数向左移动,移位个数由右操作数决定 " >>> ":无符号左移位运算符 a>>b通用公式: a/(2^b%32) 移位运算符性质 适用数据类型:byte、short、char、int、long,对低于int型的操作数...

何以渡的博客 318

信息学奥赛一本通—编程启蒙(4061:【GESP2406三级】移位)

4061:【GESP2406三级】移位

zcr201409117891的博客 289

【C语言初阶】操作符之 位运算符详解(“ << ”,“ >> ”,“ & ”,“ | ”,“ ^ ”,“ ~ ”)

操作符之 位运算符详解(“ << ”,“ >> ”,“ & ”,“ | ”,“ ^ ”,“ ~ ”)

枫叶先生的博客 5万+

Elasticsearch连接中断:深入解析Connection reset by peer问题及优化策略

本文深入解析Elasticsearch连接中断问题,特别是Connection reset by peer错误的成因与解决方案。从TCP层的心跳机制到客户端与服务端的配置差异,详细介绍了网络不稳定、防火墙拦截等常见原因,并提供了六种优化策略,包括KeepAlive调整、TCP参数调优和智能重试机制等,帮助提升Elasticsearch连接的稳定性。

weixin_42546392的博客 411

FFmpeg魔改指南:让RTMP协议完美兼容H265的三种方法(含SRS适配技巧)

本文详细介绍了三种让RTMP协议兼容H265编码的FFmpeg魔改方案,包括基于官方补丁的标准改造、Intel的SVT-HEVC集成方案以及金山云的自定义扩展方案。文章重点解析了各方案的实现原理与适配技巧,并提供了在SRS 6.0服务器上进行深度配置和性能调优的完整实战指南,帮助开发者解决H265推流至传统RTMP服务器的兼容性问题。

weixin_29290947的博客 195

算法学习之字符串左移&右移

1.设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N), 且只允许使用两个附加变量。 方法一: 每次将数组中的元素右移一位,循环K次,则实现了右移K位。 例如, 原始字符串:abcd1234 右移一位:4abcd123 右移一位:34abcd12 右移一位:234abcd1 右移一位:1234abcd 循环4次,则实现了右移4次 实现函数如下: v...

java开发指南博客 【转载】 580

使用 Mid360 从零开始搭建实物机器人入门级导航系统 —— 基于 Fast_Lio 和 Move_Base

本文详细介绍了如何使用Mid360机器人从零开始搭建一个基于Fast_Lio和Move_Base的入门级导航系统。通过配置 ROS2、集成激光雷达、IMU、Fast_Lio、Move_Base 等模块,我们成功构建了一个能够实现自动导航的机器人系统。在实际开发中,随着需求的变化,你可以不断调整参数、优化路径规划算法、增加新的传感器等,逐步提升机器人的智能与功能。

小蜗牛的珍贵百宝箱 3567

NYOJ 658 字符串右移

字符串右移 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 LZQ最近迷上了字符串,于是他有一个问题想考你,聪明的你一定知道答案。问题如下:给你一个字符串,让你对其进行向右移动K次,输出新的字符串。 输入 输入数据有多组,每组有一个字符串STR与一个数字K,表示对字符串STR向右移动K位。 输出 输出新的字符串STR1. 样例

Python3 爬虫实战 1:应对特殊字体,爬取猫眼电影实时排行榜 2343

实战详细讲解Qt插件plugin的编写与用法

qt插件的开发,可以说是动态库的开发,因为调用方式类似,多熟悉一下,利用Qt框架开发很简单的。在想想这种调用过程有的熟悉,比如公司买了一堆摄像头,公司要对摄像头进行二次开发,实现自己想要的功能,集成到一套设备里去,然后在卖给用户。此时厂商肯定会提供开发文档,并给你SDK包(软件开发工具包), 包里你会发现只有头文件和一堆库文件,没有源文件,因为实现的过程是产商公司保密的,给你看还得了。所以都封装成了库的形式给你调用,如静态库或者动态库。

qq_44667165的博客 1万+

macOS 27下PlayCover“没有权限打开”的完整修复指南

macOS系统通过Gatekeeper、TCC(透明、同意与控制)和安全启动等机制,对第三方应用进行层层校验,以防范恶意代码。这些机制会检查应用的隔离属性、签名状态以及所需系统权限,当任一环节不满足时,就会出现“没有权限打开”的提示。对于开发者工具或未上架App Store的开源软件,这类拦截尤为常见。尤其在macOS 27上,系统进一步收紧了绕过策略,导致PlayCover等工具无法正常启动。本文以PlayCover为例,详细解析权限链路上的三道关卡,并给出清除隔离属性、调整SIP状态、重置TCC记录等完

weixin_32612263的博客 750

字符串的左右移动

给定一个字符串,这个字符串为*号和26个字母。现在需要把字符串的*号移动到左侧,字母移动到右侧,字母顺序不变。 *号和字母,其实可以用一个一元函数来泛华bool func(char ch)。 3个做法: 1)空间复杂度O(n)。就是开辟一个一样长度的数组,剩下的事情就是遍历,判断,移动。从两端同时开始移动。 2) 假设func(ch)=true的放左边,fun*ch)=false

纯,属虚构 2641

Allegro如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层

在Allegro做PCB设计的时候,如果需要复制器件的位号到其它层是无法直接实现的,如果直接拷贝器件的位号的话,效果如下。但是Allegro的Cross Copy命令是支持复制任何属性的图形到其它层的,下面以复制器件位号和丝印外框为例说明。同样如果使用Z-copy命令,也是无法Z-copy text的,Finds下方texts是灰色的。如何使用Cross Copy命令快速复制器件的位号和丝印外形其他层。另外cap处可以选择线段的端点是圆形,八角形,或者方形的铜皮。拷贝C1013,出现的是C*

weixin_54787054的博客 2672

键盘输入字符串、左右移方向和移位个数打印结果

import java.util.Scanner; public class shiftCycle {  public static void shift(String s,boolean q,int i)  {   int j,k,m,n;//i为移位个数,s为输入的字符串,q为控制左右移位方向   i=i%s.length();    if(q==true){   System.

u013218720的专栏 726

SAP-ABAP:在SAP系统中,COEP表(成本控制对象行项目表)详解

在SAP系统中,COEP表(成本控制对象行项目表)详解

baidu_35680696的博客 1840

把 SM30 用顺:从表设计到权限与传输,全面掌握 SAP Table Maintenance Generator

摘要 SAP的Table Maintenance Generator(TMG)是为配置表维护需求设计的经典工具,能够生成标准化的维护对话框(SM30)。它支持单表、维护视图(多表关联)和视图簇(导航式维护)三种维护对象类型。使用TMG前需注意三个关键设置:1)表维护权限选项;2)交付类(决定数据传输行为);3)客户端字段配置。通过SE54/SE11生成维护对话框时,需选择维护类型(一步/两步)和记录例程(控制传输)。TMG生成的对象包含函数组、屏幕和处理模块,但部分标准框架不可修改。实际应用中,可通过参数事

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 176

LeetCode 1427. 字符串的左右移

LeetCode 1427. 字符串的左右移 文章目录LeetCode 1427. 字符串的左右移题目描述一、解题关键词二、解题报告1.思路分析2.时间复杂度3.代码示例2.知识点总结相同题目 题目描述 给定一个包含小写英文字母的字符串 s 以及一个矩阵 shift,其中 shift[i] = [direction, amount]: direction 可以为 0 (表示左移)或 1 (表示右移)。 amount 表示 s 左右移的位数。 左移 1 位表示移除 s 的第一个字符,并

Datao_csdn的博客 495

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

字符串循环移位

字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n) //////////////////////////////////////////////////////////////////////////// //字符串移位, void

aini201的专栏 662

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c语言循环位移(数字,字符串)

C语言中没有提供循环移位的操作符,但可以通过简洁的方式实现循环移位 设一个操作数x有s位则循环左移n位的操作为: (x > (s - n)); 同理右移n位位: (x >> n) | (x 实际编程中可以用宏定义实现循环移位: #define ROTATE_LEFT

Csdn_zc的专栏 1万+

String Operation Summary

STRING OPERATION SUMMARY1. 左右移位的区别:1.1.先左移后右移(左移一位后会直接截断)1.2.先右移后左移1.2.1.设定位数足够大 > 赋值的位数加移动位数时:1.2.2.设定位数 < 赋值的位数加移动位数时:2. 左右互换:2.1. 赋值的位数 = 定义中的位数时:2.2. 特别注意:(对于CHAR类型来说中间位置是按照定义的长度计算的)3. 拼接字符串...

凌薇 1136

[Leetcode学习]Perform String Shifts(字符串移位)

问题: 难度easy 说明: 输入会给一个string以及一个shift数组,shift是一个int[][]二维数组,当int[0] = 0时候往左移动,int[0] = 1往右移动。int[1]则是给出移动多少的位置,而且数组是想象成头尾相连的。 输入输出案例: Input: s = "abcdefg", shift = [[1,1],[1,1],[0,2],[1,3]] Outpu...

qq_28033719的博客 457

IP地址转换为整数、正则分割字符串split、字符串转整数、左右移位、sprintf、string.find()、regex_token_iterator、atoi()

【代码】IP地址转换为整数、正则分割字符串split、字符串转整数、左右移位、sprintf、string.find()、regex_token_iterator、atoi()

z164470的博客 305

2012华为校园招聘上机考试题(上海交大考场)

今天参加了华为的上机考试。一共两道题,题目挺简单的。我简要回顾一下吧: (1)将字符串转换为整数(可能为负数) 例如:输入“5456”的字符串,要求得到5456整数;输入“-2048”,得到-2048 函数原型: void strToInt(char* s

奔跑 933

C#winform 走马灯程序

private void btnleft_Click(object sender, EventArgs e)        {            string str =textBox1.Text;   //易错点:容易将其设置为常量,string str = "123456", 那样就只能向左移动一次            char s = str[0];            string

Burst With Long Accumulate 1479

249. Group Shifted Strings

【代码】249. Group Shifted Strings。

ujn20161222的博客 554
上一篇: HDOJ 1001
下一篇: 最大公约数
cbjust
博客等级 码龄15年 4粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值