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)
}
}