初阶C-0215

1.实现一个函数,可以左旋字符串中的k个字符。

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

void left_rotate(char* str,int k){
    while(k--){
    	char tmp = *str;
    	char* cur = str;
    	while(*(cur + 1)){	//判断真假是否到了‘\0’
    		*cur = *(cur + 1);
    		cur++;
    	}
        *cur = tmp;
    }
}

这里有一个问题需要我们去注意

当我们左旋的时候,将B C D移动向前之后,之前字符串的\0也被提前了。

但是字符串数组本身最后有一个\0,所以我们要在字符串的前一个位置,把旋转的字符与前面的\0交换

那么这个时候在while循环里,需要将我们的cur向后移动一个位置,也就是字符串之前的最后一个位置。

此时的判断条件为cur + 1

int main(){
    char str[] = "ABCD";
    int k;
    scanf("%d", &k);
    printf("%s",str)
    left_rotate(str, k);
    printf("%s",str);
}

关于右旋,右旋就是左旋的相反,即strlen(str)-k次,直接在右旋中,调用左旋设置k的次数即可

2.判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

int is_rotate(char* dest, char* src){
    if(strlen(dest) != strlen(src)){
        return 0;
    }
    int len = strlen(src);
    while(len--){
        right_rotate(src, 1);//一次一个判断
        if(strcmp(dest, src) == 0){
            return 1;
        }
        return 0;
    }
}

3.一个数组中只有两个数字是出现一次, 其他所有数字都出现了两次。

找出这两个数字,编程实现。

首先要清楚连续异或的结果,因为单独出现的数字会在最后呈现出来

这样我们就可以找到异或结果中,二进制‘1’在什么位置不同

根据‘1’的位置把所有数分成两组,每一组当中必有一个数单独出现一次

int main(){
    int a[]={ 1, 2, 3, 4, 6, 6, 2, 3, 4, 1, 9, 10};
    int ret = 0;
    int pos = 0;
    int sz = sizeof(a)/sizeof(a[0]);
    int i = 0;
    for(i = 0;i < sz;i++){
        ret ^= a[i];
    }
    for(i = 0;i < 32;i++){
        if(((ret >> i) & 1) == 1){
        	pos = i;
        	break;
        }
    }
    for(i = 0;i < sz;i++){
        if(((a[i] >> pos) & 1) == 1){
            x ^= a[i];
        }
        else{
            y ^= a[i];
        }
    }
    printf("%d %d",x,y);
    return 0;
}

4.喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水, 给20元,可以多少汽水。

编程实现。

int main(){
    int empty ;
    int total ;
    int money;
    scanf("%d",&money);
    total = money;
    empty = money;
    while(empty > 1){
       	total +=  (empty / 2);
        empty = (empty % 2) + (empty / 2)
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值