有一个由小写字母组成的字符串 S,和一个整数数组 shifts。我们将字母表中的下一个字母称为原字母的 移位(由于字母表是环绕的, ‘z’ 将会变成 ‘a’)。例如·,shift(‘a’) = ‘b’, shift(‘t’) = ‘u’,, 以及 shift(‘z’) = ‘a’。对于每个 shifts[i] = x , 我们会将 S 中的前 i+1 个字母移位 x 次。返回将所有这些移位都应用到 S 后最终得到的字符串。
字符移位问题 leetcode 843
/**
* 字符移位问题 leetcode 843
* 有一个由小写字母组成的字符串 S,和一个整数数组 shifts。
* 我们将字母表中的下一个字母称为原字母的 移位(由于字母表是环绕的, 'z' 将会变成 'a')。
* 例如·,shift('a') = 'b', shift('t') = 'u',, 以及 shift('z') = 'a'。
* 对于每个 shifts[i] = x , 我们会将 S 中的前 i+1 个字母移位 x 次。
* 返回将所有这些移位都应用到 S 后最终得到的字符串。
*
* 示例:
* 输入:S = "abc", shifts = [3,5,9]
* 输出:"rpl"
* 解释:
* 我们以 "abc" 开始。
* 将 S 中的第 1 个字母移位 3 次后,我们得到 "dbc"。
* 再将 S 中的前 2 个字母移位 5 次后,我们得到 "igc"。
* 最后将 S 中的这 3 个字母移位 9 次后,我们得到答案 "rpl"。
*/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| public class shiftingLetters { /** * 方法一:不推荐,但好理解 * @author yiming.liang * @date 2019/3/20 15:33 * @param [S, shifts] * @return java.lang.String */ public static String shiftingLetter(String S, int[] shifts) { //目的为了拼字符串的 StringBuffer sb = new StringBuffer(); char c = 0; for(int i = shifts.length-2;i>=0;i--){ //从后往前算应该向后走几步,因为题目中说第二个走,第一个也走,第三个走,前两个也走 //所以最后一个走的是最少的,只走一步,而第一个走的最多,是后几个步数的和 //这样就比较好理解,我们直接从倒数第二个字母开始,将他和最后一人走的加起来,算出倒数第二个字母走的步数 //之后依次累加即可 shifts[i] += shifts[i+1]%26; } for (int i = 0; i < S.length(); i++) { // c = (char)(c.charAt(i) - 'a' + shift) % 26 + 'a'); //这里分情况,上面那个是最好的方式但难理解,下面那个是好理解但麻烦 //下面这边分两种情况,第一钟是字母向后走但不超过z 直接加即可 c = (char)(S.charAt(i) + shifts[i]%26); //如果超了z即122,这里拿一个栗子来说明,用例中"ruu",{26,9,17}; //u要向后走17步,而u的ascii码为117,走17步明显超过了z则判断是否大于122 //如果大于122,则算出大了多少,17+117-122 = 12则我们从u开始还要向后走5步到z //再返回去走12步,这时我们是从z开始走的,则a也要被算在内,而我们后面的+'a'则代表着从a开始走 //显然a也被算在这12步内了,所以要-1再+'a' //over if(c>122){ c = (char) ((c-122)-1 + 'a'); sb.append(c); }else{ sb.append(c); } } return sb.toString(); }
/** * 方法二:推荐 * @author yiming.liang * @date 2019/3/20 16:45 * @param [S, shifts] * @return java.lang.String */ public String shiftingLetter2(String S, int[] shifts) { char[] arr = S.toCharArray(); int shift = 0; for (int i = arr.length - 1; i >= 0; i--) { shift = (shift + shifts[i]) % 26; arr[i] = (char)((arr[i] - 'a' + shift) % 26 + 'a'); } return new String(arr); }
public static void main(String[] args) { // char i = 'a'+1; int[] shifts = {26,9,17}; String str = shiftingLetter("ruu",shifts); System.out.println(str);
} }
|