BM83. 字符串变形
描述
输入描述
给定一个字符串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; } };