给定一个字符串,翻转字符串中的每个单词; 字符串重新格式化

把一个字符串按照单词反转过来,比如 "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
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值