-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStrArrayDemo.java
More file actions
197 lines (157 loc) · 4.71 KB
/
StrArrayDemo.java
File metadata and controls
197 lines (157 loc) · 4.71 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package strArray;
import sun.nio.ch.FileKey;
import java.lang.reflect.Array;
import java.util.Arrays;
/**
* @author zhongshanhuang
* @company caih
* @email [email protected]
* @create 2019-08-21 16:52
*/
public class StrArrayDemo {
public static void main(String[] args) {
//1,反转字符串
// SwapWords swapWords = new SwapWords();
// System.out.println(swapWords.swapsWords("how are you"));
//2,比较两个字符串是否是相同字符组成
// CompareSam compareSam = new CompareSam();
// System.out.println(compareSam.compareSamBySort("aaaabbc","abcbaaa"));
// System.out.println(compareSam.compareSam("aaaabbc","abcbaa"));
//3,删除重复字符
// RemoveDuplicate removeDuplicate = new RemoveDuplicate();
// System.out.println(removeDuplicate.removeDuplicate("abcaabcd"));
// System.out.println(removeDuplicate.removeDuplicateBySpace("abcaabcd"));
}
}
/**
* 1,反转字符串
*/
class SwapWords {
public String swapsWords(String s) {
char[] cArr = s.toCharArray();
//对整个字符串进行反转
swap(cArr, 0, cArr.length - 1);
int begin = 0;
//对每一个单词进行字符串反转
for (int i = 0; i < cArr.length; i++) { //从1开始是因为最开头是“
if (cArr[i] == ' ') {
swap(cArr, begin, i - 1);
begin = i + 1;
}
}
//对最后一个单词进行反转
swap(cArr, begin, cArr.length - 1);
return new String(cArr);
}
private void swap(char[] cArr, int front, int end) {
while (front < end) {
char temp = cArr[end];
cArr[end] = cArr[front];
cArr[front] = temp;
front++;
end--;
}
}
}
/**
* 2,比较两个字符串是否是相同字符组成
*/
class CompareSam {
//1,排序法
public boolean compareSamBySort(String s1, String s2) {
// byte[] b1 = s1.getBytes();
// byte[] b2 = s2.getBytes();
char[] b1 = s1.toCharArray();
char[] b2 = s2.toCharArray();
Arrays.sort(b1);
Arrays.sort(b2);
s1 = new String(b1);
s2 = new String(b2);
if (s1.equals(s2)) {
return true;
} else {
return false;
}
}
//2,空间法
public boolean compareSam(String s1, String s2) {
byte[] b1 = s1.getBytes();
byte[] b2 = s2.getBytes();
int[] bCnt = new int[256];
//初始化为0
for (int i = 0; i < bCnt.length; i++) {
bCnt[i] = 0;
}
//统计个数,增加
for (int i = 0; i < b1.length; i++) {
bCnt[b1[i] - '0']++;
}
//统计个数,减少
for (int i = 0; i < b2.length; i++) {
bCnt[b1[i] - '0']--;
}
//检验
for (int i = 0; i < bCnt.length; i++) {
if (bCnt[i] != 0) {
return false;
}
}
return true;
}
}
/**
* 3,删除字符串中重复的字符
*/
class RemoveDuplicate {
//1,暴力法
public String removeDuplicate(String str) {
char[] cArr = str.toCharArray();
int len = cArr.length;
for (int i = 0; i < len; i++) {
if (cArr[i] == '\0') { //ASCII码为0,表示一个字符串结束的标志
continue;
}
for (int j = i + 1; j < len; j++) {
if (cArr[i] == '\0') {
continue;
}
if (cArr[i] == cArr[j]) {
cArr[i] = '\0';
}
}
}
//去掉'\0'
int cnt = 0;
for (int i = 0; i < len; i++) {
if (cArr[i] != '\0') {
cArr[cnt++] = cArr[i];
}
}
return new String(cArr, 0, cnt);
}
//2,空间换时间法
public String removeDuplicateBySpace(String str) {
char[] cArr = str.toCharArray();
int len = cArr.length;
int[] flags = new int[8]; //只需要8个32为的bit 的int,8 * 32 = 256 bit
for (int i = 0; i < 8; i++) {
flags[i] = 0;
}
for (int i = 0; i < len; i++) {
int index = (int) (cArr[i] / 32);
int shift = (int) (cArr[i] % 32);
if ((flags[index] & (1 << shift)) != 0) { //???
cArr[i] = '\0';
}
flags[index] |= (1 << shift); //???
}
//去掉'\0'
int cnt = 0;
for (int i = 0; i < len; i++) {
if (cArr[i] != '\0') {
cArr[cnt++] = cArr[i];
}
}
return new String(cArr, 0, cnt);
}
}