Lei's Blog

字符串

反转字符串

编写一个函数,其作用是将输入的字符串反转过来。

示例 1:

1
2
输入: "hello"
输出: "olleh"

示例 2:

1
2
输入: "A man, a plan, a canal: Panama"
输出: "amanaP :lanac a ,nalp a ,nam A"
  • C语言实现

解题思想 指针法

由于C中并没有数组长度的api,需要我们自己计算数组的长度。字符数组中以'\0'结尾, 新建一个指针p变量指向形参, 判断p != '\0' 然后 p++ 同时用一个int变量记录p执行的次数,可知数组的长度

创建两个char类型指针变量start = s, end = s + k - 1 ,k-1切记,数组下标是从0开始的。 判断 start < end 指针变量互换。 start++, end--.

另一种使用指针的方式 定义一个变量i = 0; i < len / 2 - 1 如果满足条件 使 *(s+i) = *(s + len - 1 - i)

  1. 第一种方式
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
#include <stdio.h>
char* reverseString(char* s);
int main() {
char strs[] = "123";
printf("%s\n", reverseString(strs));
return 0;
}
char* reverseString(char* s) {
// 获取字符串长度
int k = 0;
while (s[k] != 0)
{
k++;
}
char *start = s;
char *end = s + k - 1;
char ch;
while (start < end) {
ch = *start;
*start++ = *end;
*end-- = ch;
}
return s;
}
  1. 第二种方式
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
#include <stdio.h>
void reverse(char* s)
{
// 获取字符串长度
int len = 0;
char* p = s;
while (*p != 0)
{
len++;
p++;
}
// 交换 ...
int i = 0;
char c;
while (i <= len / 2 - 1)
{
c = *(s + i);
*(s + i) = *(s + len - 1 - i);
*(s + len - 1 - i) = c;
i++;
}
}
int main()
{
char s[] = "www.runoob.com";
printf("'%s' =>\n", s);
reverse(s); // 反转字符串
printf("'%s'\n", s);
return 0;
}

整数反转

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

1
2
输入: 123
输出: 321

示例 2:

1
2
输入: -123
输出: -321

示例 3:

1
2
输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

  • Swift

解题思路
swift 有自己的apiInt32.max Int32.min 占用4字节int值的最大取值范围和最小取值范围
定义一个变量rev = 0
对源数字除以10取余%, 每次取到的数字即为个位数i, 同时原值除以10. 讲各位数抛出, 同时rev*10 + i 翻转后的值, 判断翻转后的值是否在4字节的Int范围内。如果不在 return 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import UIKit
func reverse(_ x: Int) -> Int {
var originValue: Int = x;
var rev: Int = 0
while originValue != 0 {
let pop: Int = originValue % 10
originValue /= 10
rev = rev * 10 + pop;
if rev > Int32.max {
return 0 ;
}
if rev < Int32.min {
return 0 ;
}
}
return rev
}
var x:Int = 1534236469
print(reverse(x));

字符串中的第一个唯一字符

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

案例:

1
2
3
4
5
s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.

注意事项: 您可以假定该字符串只包含小写字母。

  • C

定义一个变量flag

先算出字符数组长度,如果为1则return 0

如果为0则return -1

使用两层for循环,如果 i 元素 等于 j 元素 且 i != j 则flag =1, 如果 flag = 0 则返回当前i。

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
#include <stdio.h>
#include <string.h>
int firstUniqChar(char* s);
int main() {
char s[] = "leetcode";
printf("打印结果是 %d\n", firstUniqChar(s));
return 0;
}
int firstUniqChar(char* s) {
char *p = s;
int count = 0;
while (*p != '\0') {
p++;
count++;
}
if (count == 1)
{
return -1;
}
if (count == 0)
{
return -1;
}
p = s;
int flag = 0;
for (int i = 0; i < count; i ++) {
flag = 0;
for (int j = 0; j < count; j++)
{
if (*(p + i) == *(p + j) && i != j)
{
flag = 1;
break;
}
}
if (flag == 0)
{
return i;
}
}
return -1;
}
  • Swift

使用 ASCII码来解决

a = 97 定义一个长度为26的数组,每个元素为0,遍历字符数组,使用当前字符ascii减去97 得到一个索引,用得到的索引找到数组中的值并+1

重新遍历字符数组,以索引找值,如果值为1,则返回当前索引,如果没有则在外部返回-1;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import UIKit
func firstUniqChar(_ s: String) -> Int {
var array = Array<Int>(repeating: 0, count: 26);
for char in s.unicodeScalars {
let index = Int(char.value - 97);
array[index] = array[index] + 1;
}
for (index, character) in s.unicodeScalars.enumerated() {
let count = array[Int(character.value - 97)]
if count == 1 {
return index
}
}
return -1;
}
var str: String = "leetcode"
print(firstUniqChar(str))