列表

详情


BM83. 字符串变形

描述

对于一个长度为 n 字符串,我们需要对它做一些变形。

首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。

比如"Hello World"变形后就变成了"wORLD hELLO"。

数据范围: , 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度 , 时间复杂度

输入描述

给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)

输出描述

请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。

示例1

输入:

"This is a sample",16

输出:

"SAMPLE A IS tHIS"

示例2

输入:

"nowcoder",8

输出:

"NOWCODER"

示例3

输入:

"iOS",3

输出:

"Ios"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Go 解法, 执行用时: 15ms, 内存消耗: 7160KB, 提交时间: 2021-11-24

package main

/**
 * 
 * @param s string字符串 
 * @param n int整型 
 * @return string字符串
*/
import "bytes"

func trans( s string ,  n int ) string {
 	// write code here
	sb := []byte(s)
	sbuf := bytes.Buffer{}
	sbuf.Grow(n)
	i:= n-1
	
	for j:=n-1;j>=0;j--{
		if j<n-1 && s[j] == ' ' {
			reverseBuf(sb[j+1:i+1])
			sbuf.Write(sb[j+1:i+1])
		}
		k := j
		for ;j>=0 && s[j] == ' ';j--{}
		if k != j {
			sbuf.Write(sb[j+1:k+1])
			i = j
		}
	}
	if i>=0 {
		reverseBuf(sb[:i+1])
		sbuf.Write(sb[:i+1])
		
	}
	return sbuf.String()
}


func reverseBuf(buf []byte) {
	for i:=0;i<len(buf);i++{
		buf[i] ^= 32
	}
}

Go 解法, 执行用时: 15ms, 内存消耗: 8548KB, 提交时间: 2021-04-01

package main
import "bytes"
/**
 * 
 * @param s string字符串 
 * @param n int整型 
 * @return string字符串
*/
func trans( s string ,  n int ) string {
    // write code here
    bs := []byte(s)
    retBuf := bytes.Buffer{}
    preIdx := len(bs)
    for i:=len(bs)-1; i>=0; i-- {
        if bs[i] == ' ' {
            if preIdx - i > 1 {
                retBuf.WriteString(string(bs[i+1:preIdx]))
            }
            retBuf.WriteByte(' ')
            preIdx = i
            continue
        }
        bs[i] ^= 0x20
    }
    if bs[0] != ' ' {
        retBuf.WriteString(string(bs[:preIdx]))
    }
    
    
    return retBuf.String()
}

Go 解法, 执行用时: 16ms, 内存消耗: 6080KB, 提交时间: 2021-08-14

package main

/**
 * 
 * @param s string字符串 
 * @param n int整型 
 * @return string字符串
*/

func trans(s string, n int) string {
	str := []byte(s)
	lens := len(str)
	buf := make([]byte, 0, len(str))
	var index, count int
	for i := lens - 1; i >= 0; i-- {
		if str[i] != ' ' {
			str[i] = transfer(str[i])
			if count == 0 {
				index = i
			}
			count++
		} else {
			if count > 0 {
				buf = append(buf, str[index-count+1:index+1]...)
				count = 0
			}
			buf = append(buf, ' ')
		}
	}
	if count > 0 {
		buf = append(buf, str[index-count+1:index+1]...)
	}
	return string(buf)
}

func transfer(x byte) byte {
	if x < 'a' {
		return x + 32
	} else {
		return x - 32
	}
}

Go 解法, 执行用时: 16ms, 内存消耗: 8244KB, 提交时间: 2020-12-25

package main

/**
 * 
 * @param s string字符串 
 * @param n int整型 
 * @return string字符串
*/
func trans( s string ,  n int ) string {
	// write code here
	b := make([]byte, 0, len(s)) // 结果

	s1 := []byte(s)

	endIndex := n - 1
	for i := n - 1; i >= 0; i-- {
		// 转变大小写
		if s1[i] >= 65 && s1[i] <= 90 {
			s1[i] += 32
		} else {
			if s1[i] >= 97 && s1[i] <= 122 {
				s1[i] -= 32
			}
		}

		if i == 0 {
			if s1[i] == 32 {
				b = append(b, s1[1:endIndex+1]...)
				b = append(b, 32)
			} else {
				b = append(b, s1[:endIndex+1]...)
			}

			break
		}

		if s[i] == 32 {
			b = append(b, s1[i+1:endIndex+1]...)
			b = append(b, 32)
			endIndex = i - 1
		}
	}

	return string(b)
}

C++ 解法, 执行用时: 17ms, 内存消耗: 6412KB, 提交时间: 2022-08-06

static const auto io_sync_off = []()
{
    std::ios::sync_with_stdio(false);//关闭输入输出
    std::cin.tie(nullptr);//取消两个stream绑定
    std::cout.tie(nullptr);//取消cin 和 cout之间的绑定,加快执行效率
    return nullptr;
}();

class Solution {
public:
    string trans(string s, int n) {
        // write code here
        reverse(s.begin(),s.end());
        int i=0,j=0;
        while(i<n){
            j=i;
            while(j<n&&s[j]!=' '){
                if(s[j]>='a'&&s[j]<='z')
                    s[j]+='A'-'a';//小写转成大写
                else
                    s[j]-='A'-'a';//大写转成小写
                ++j;
            }
            reverse(s.begin()+i,s.begin()+j);
            i=j+1;//跳过空格
            while(i<n&&s[i]==' ')
                i++;
        }
        return s;
    }
};

上一题