对于一个长度为 n 字符串,我们需要对它做一些变形。
首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把这个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。
比如"Hello World"变形后就变成了"wORLD hELLO"。
数据范围:
, 字符串中包括大写英文字母、小写英文字母、空格。
进阶:空间复杂度
, 时间复杂度
给定一个字符串s以及它的长度n(1 ≤ n ≤ 10^6)
请返回变形后的字符串。题目保证给定的字符串均由大小写字母和空格构成。
"This is a sample",16
"SAMPLE A IS tHIS"
"nowcoder",8
"NOWCODER"
"iOS",3
"Ios"
import java.util.*; public class Solution { public String trans(String s, int n) { StringBuilder spaceR = new StringBuilder(); String[] sList = s.split(" "); reverse(sList); int j = s.length()-1; while (j >= 0 && s.charAt(j) == ' ') { spaceR.append(" "); j--; } StringBuilder sNew = new StringBuilder(); sNew.append(spaceR.toString()); for (int i = 0;i < sList.length;i++) { if (i == sList.length-1) { sNew.append(sList[i]); continue; } sNew.append(sList[i] + " "); } return sNew.toString(); } public void reverse(String[] sList) { int left = 0; int mid = sList.length / 2; int j = sList.length - 1; for (int i = 0;i < mid;i++) { String tmp = sList[i]; sList[i] = lowUpper(sList[j]); sList[j] = lowUpper(tmp); j--; } if (sList.length % 2 != 0) { sList[j] = lowUpper(sList[j]); } } public String lowUpper(String s) { StringBuilder sNew = new StringBuilder(); for (int i = 0;i < s.length();i++) { int tmp = s.charAt(i); if (tmp >= 97 && tmp <= 122) { tmp -= 32; }else if (tmp >= 65 && tmp <= 90){ tmp += 32; } sNew.append((char) tmp); } return sNew.toString(); } }
import java.util.*; //不要用split 空格问题会坑死自己 public class Solution { public String trans(String s, int n) { String res = ""; String tempStr = ""; for(int i = 0; i < n; i++){ char c = s.charAt(i); if(c>='a'&& c<='z') tempStr += Character.toUpperCase(c); else if(c>='A'&& c<='Z') tempStr += Character.toLowerCase(c); else{ tempStr = c+tempStr; res = tempStr + res; tempStr=""; } } res = tempStr+res; return res; } }
import java.util.*; public class Solution { // 反转字符串大小写 public String reverse(String str){ StringBuilder stringBuilder = new StringBuilder(); for(int i = 0; i < str.length(); i++){ if(Character.isUpperCase(str.charAt(i))){ stringBuilder.append(Character.toLowerCase(str.charAt(i))); }else{ stringBuilder.append(Character.toUpperCase(str.charAt(i))); } } return stringBuilder.toString(); } public String trans(String s, int n) { // write code here String[] tmp = s.split(" ", -1);// 这里,limit设置为-1,模式可以应用无数次 StringBuilder stringBuilder = new StringBuilder(); for(int i = tmp.length - 1; i >= 0; i--){ stringBuilder.append(reverse(tmp[i])); if(i != 0){ stringBuilder.append(" "); } } return stringBuilder.toString(); } }
public class Solution { public String trans(String s, int n) { // 本题实际就是把字符串s反转(单词中的字符位置不反转),遇到空格不变,遇到大写字母变成小写,小写字母变成大写 StringBuffer res = new StringBuffer(); // 存放最终结果 int index = 0; // 记录字母应插入的位置 for (int i = n - 1; i >= 0; i--) { char ch = s.charAt(i); if (ch == ' ') { res.append(" "); index = res.length(); } else { // 当前字符是字母 if (ch >= 'A' && ch <= 'Z') { res.insert(index, (char)(ch + 32)); // 大写字母变为小写,每次都插在index位置 } else { res.insert(index, (char)(ch - 32)); // 小写字母变为大写,每次都插在index位置 } } } return res.toString(); } }
class Solution { public: string trans(string s, int n) { // 时间复杂度O(N),空间复杂度O(N) stack<string> stk; string tmp, res; for (char &c : s) { if (c >= 'a' && c <= 'z') tmp += c - 'a' + 'A'; else if (c >= 'A' && c <= 'Z') tmp += c - 'A' + 'a'; else { stk.push(tmp); stk.push(" "); tmp.clear(); } } if (!tmp.empty()) stk.push(tmp); while (stk.size() != 1) { res += stk.top(); stk.pop(); } res += stk.top(); return res; } };
/** * * @param s string字符串 * @param n int整型 * @return string字符串 * * C语言声明定义全局变量请加上static,防止重复定义 * * C语言声明定义全局变量请加上static,防止重复定义 */ static char transChar(char c) {//构建字符转换函数 if (c <= 'Z' && c >= 'A') c += 32; else if (c <= 'z' && c >= 'a') { c -= 32; return c; } return c;//当都不满足条件时,返回原符号,本题即返回空格 } char* trans(char* s, int n ) { int left = 0, right = 0;//双指针 char* t = (char* )malloc(sizeof(char) * (n + 1)); //构建n+1个符号长度的字符串t,多出来的一个是为了防止内存溢出,如果只分配n个符号,最后一个用例不会通过 for (int i = 0; i < n; i++) t[i] = ' '; t[n] = '\0'; //初始化字符串,全部赋值空格,方便输出 if (s[0] == '\0') return ""; for (int i = 0; i <= n; i++) {//从左至右遍历s if ( (s[right] == ' ' || s[right] == '\0') && right <= n ) { //以空格为分隔,选出单个单词 for (int i = 0; i < (right - left); i++) { t[n - right + i] = transChar(s[left + i]); //将left到right中间的单词子串转换并反转,从右到左赋给t,子串从左到右遍历 } right ++; left = right;//左右指针同时右移,继续下一个单词取词 } else right++;//当右指针不在空格时,右指针右移,左指针不动 } return t; // write code here }
· 第二步翻转整个字符串
class Solution { public: void myReserve(string &s,int left,int right){ if(left<0||right<0) return; while(left<right) std::swap(s[left++],s[right--]); } string trans(string s, int n) { // write code here int k ='a'-'A'; int l=0,r=0; while(r<n){ if(s[r]!=' '&&s[r]<'a') s[r]+=k; else if(s[r]!=' '&&s[r]>='a') s[r]-=k; if(r==n-1) { if(s[r]!=' ') myReserve(s,l,r); break; } else if(s[r]==' ') { myReserve(s,l,r-1); l=r+1; r=l; } else r++; } myReserve(s, 0, n-1); return s; } };
function trans(s, n) { //write code here return s.split(" ") .reverse() .map((item) => { return [...item].map((char) => char == char.toLowerCase() ? char.toUpperCase() : char.toLowerCase() ).join(''); }).join(' '); }
import java.util.Scanner; public class TransString { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String s = scanner.nextLine(); int n = scanner.nextInt(); System.out.println(transString(n, s)); } } public static String transString(int n, String s) { int flag = 0; if(s.charAt(s.length()-1) == ' '){ flag = 1; s = s.substring(0, s.length()-1); } String[] strings = s.split(" "); StringBuffer tranBuffer = new StringBuffer(); if(flag == 1){ tranBuffer.append(" "); } for (int i = strings.length - 1; i >= 0; i--) { StringBuffer buffer = new StringBuffer(strings[i]); for (int j = 0; j < strings[i].length(); j++) { if (Character.isUpperCase(strings[i].charAt(j))) { buffer.setCharAt(j, Character.toLowerCase(strings[i].charAt(j))); } else { buffer.setCharAt(j, Character.toUpperCase(strings[i].charAt(j))); } } if (i != 0) { tranBuffer.append(buffer + " "); } else { tranBuffer.append(buffer); } } return tranBuffer.toString(); } }
}
class Solution { public: string trans(string s, int n) { int begin = 0; int end = 0; for(int i=0;i<s.size();++i){ tran_case(s[i]); if(s[i]==' '){ string_swap(s, begin, i-1); begin = i +1; } if(i==s.size()-1){ string_swap(s, begin, i); } } string_swap(s, 0, n-1); return s; } private: void string_swap(string& str, int begin, int end){ int mid = (end-begin-1)/2; for(int i=0;i<=mid;++i){ swap(str[begin+i],str[end-i]); } } void tran_case(char& word){ if(word>='a' && word<='z'){ word = word + 'A' - 'a'; } else if(word>='A' && word<='Z'){ word = word + 'a' - 'A'; } else{ word = word; } } };
func trans(s string, n int) string { // 大小写 var sb strings.Builder for i := 0; i < len(s); i++ { if 'a' <= s[i] && s[i] <= 'z' { sb.WriteByte(s[i] - 32) } else if 'A' <= s[i] && s[i] <= 'Z' { sb.WriteByte(s[i] + 32) } else { sb.WriteByte(s[i]) } } // 反转 arr := strings.Split(sb.String(), " ") i, j := 0, len(arr)-1 for ; i < j; i, j = i+1, j-1 { arr[i], arr[j] = arr[j], arr[i] } return strings.Join(arr, " ") }
import java.util.*; public class Solution { public String trans(String s, int n) { if(s==null||s.length()==0){ return ""; } if("".equals(s.trim())){//有个脑残用例全是空格,直接返回 return s; } String[] arr = s.split(" "); boolean flag = s.endsWith(" ");//有个傻吊用例hi后面有空格 String temp; for (int i = 0; i <= (arr.length - 1) / 2; i++) { temp = arr[i]; arr[i] = arr[arr.length - i - 1]; arr[arr.length - i - 1] = temp; } for (int i = 0; i < arr.length; i++) { String item = arr[i]; StringBuilder sb = new StringBuilder(); for (int j = 0; j < item.length(); j++) { char c = item.charAt(j); if (c >= 'a' && c <= 'z') { sb.append(("" + c).toUpperCase()); } else { sb.append(("" + c).toLowerCase()); } } arr[i] = sb.toString(); } StringBuilder sb = new StringBuilder(); for (int i = 0; i < arr.length; i++) { sb.append(i == arr.length - 1 ? arr[i] : arr[i] + " "); } return flag ? " " + sb.toString() : sb.toString(); } }
作者:SoPlaying 链接:https://www.nowcoder.com/discuss/384816014410743808 来源:牛客网 import java.util.*; public class Solution { // 字符串数组翻转函数 public void reverseArr(char[] arr, int i, int j) { // 双指针左右滑动 int left = i; int right = j; while(left<right) { char temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } public String trans(String s, int n) { // 字符串数组原地修改 char[] str = s.toCharArray(); // 遍历更新:大写变小写、小写变大写、空值则不做处理 for(int i=0; i<n; i++) { char element = str[i]; if(element>='A' && element<='Z') str[i] = (char)(element-'A'+'a'); else if(element>='a' && element<='z') str[i] = (char)(element-'a'+'A'); } // 先整体翻转 reverseArr(str, 0, n-1); // 此时每个单词也逆序了,需要根据空格将每个单元重新反转回去 for(int i=0; i<n; i++) { if(str[i]==' ') continue; // 双指针,左指针的单词起始位置,右指针为单词末后一个位置 int j=i; while(j<n && str[j]!=' ') j++; reverseArr(str, i, j-1); i=j; // 更新左边界值 } return new String(str); } }
这个代码为什么会超时呢?
class Solution { public: string trans(string s, int n) { // write code here int p = 0; string ans; for (int i = 0; i < n; i++) { if (s[i] >= 'A' && s[i] <= 'Z') { s[i] += 32; } else if (s[i] >= 'a' && s[i] <= 'z') { s[i] -= 32; } else { ans = s.substr(p, i - p) + " " + ans; p = i + 1; } } ans = s.substr(p, n - p) + " " + ans; ans.erase(ans.size() - 1, 1); return ans; } };