YMLiang

有一个由小写字母组成的字符串 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);

}
}

 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 , 总访问量为 次 。
Copyright 2018-2019 YMLiang'BLOG   |   京ICP备 - 19039949  |  载入天数...载入时分秒...