把一个字符串按照单词反转过来,比如 "the sky is in blue",反转成"blue in is sky the"
用OC的就比较简单了,
1.先用空格切割这个字符串,
2.然后反转数组,
3.最后在把数组用空格join起来就可以了.
- (void)viewDidLoad {
[super viewDidLoad];
// oc实现
NSString * str = @"the sky is blue";
NSArray * array = [str componentsSeparatedByString:@" "];
NSString * result = @"";
NSArray * resultArray = [[array reverseObjectEnumerator] allObjects];
result = [resultArray componentsJoinedByString:@" "];
NSLog(@"%@",result);
}
c语言的实现才是重点,
1.移动到最后找出字符串的最后一个字符
2.left向前寻找单词的边界,如果为' ',说明是单词的分隔了
3.找到后left和right之间的就是一个完整的单词,加入到result中
4.继续2,3步,直到left==0, 这时result中的就是结果了,注意处理' '的情况
// c语言实现
char * str = "the sky is in blue";
// 存放结果字符串
char result[100] ={};
// 这个单词的左边
int left = 0;
// 单词的右边
int right = 0;
// result数组的下表
int resultI = 0;
// 先找到原始字符串的最后一个char的下表
for (int i = 0; str[i]!='\0'; i++) {
left = right = i;
}
while (left >= 0) {
// left开始左移,寻找单词的最左边
while (str[left]!=' ' && left>0) {
left--;
}
// 把这个单词放入到result中,空格单独处理下
for (int i = left; i<=right; i++) {
if (str[i] == ' ' ) {
continue;
}
result[resultI] = str[i];
resultI ++;
}
// 手动在后面追加空格
result[resultI] = ' ';
resultI++;
// 找下一个单词
right = left;
left --;
}
// 去掉最后一个空格
result[resultI-1] = '\0';
NSLog(@"%s",result);
还有一个字符串的题,比较简单,就不单独写文章了
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。
请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。
输入:s = "a0b1c2"
输出:"0a1b2c"
解释:"0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。
输入:s = "leetcode"
输出:""
解释:"leetcode" 中只有字母,所以无法满足重新格式化的条件。
输入:s = "1229857369"
输出:""
解释:"1229857369" 中只有数字,所以无法满足重新格式化的条件。
输入:s = "covid2019"
输出:"c2o0v1i9d"
输入:s = "ab123"
输出:"1a2b3"
思路还是蛮简单的,
1.遍历一遍字符串, 找出里面的数字和字母,分别放到数字数组中和字母数组中,
2.检查是否满足条件, 较多的数组-较少的数组 差值不能超过2
3.先把较多的数组取值拼在第一个,然后在较少的数组取值拼一个, 最后结果就出来了
class Solution {
func reformat(_ s: String) -> String {
var numArray = Array<Character>.init()
var charArray = Array<Character>.init()
// 遍历每个字符,放到对应的字母数组和数字数组中
for c in s.enumerated() {
if c.element.isNumber {
numArray.append(c.element)
} else {
charArray.append(c.element)
}
}
// 数量多的放到largeArray中, 数量少的放到smallArray中, 这样就不用关心数字多还是字母多了
var largerArray = charArray
var smallArray = numArray
if numArray.count>charArray.count {
largerArray = numArray
smallArray = charArray
}
// 超过2,肯定不能组成了,直接返回空字符串
if largerArray.count-smallArray.count>=2 {
return ""
}
// 拼装成新的字符串
var result = ""
while !largerArray.isEmpty {
result.append(largerArray.popLast()!)
if !smallArray.isEmpty {
result.append(smallArray.popLast()!)
}
}
return result
}
}