目录
1、将句子排列(简单)
package paixu;
public class lian_01 {
public static void main(String[] args) {
String s = "is2 sentence4 This1 a3";
System.out.println(sortSentence(s));
}
public static String sortSentence(String s) {
String[] s1 = s.split(" ");
//存放排序好的单词
String[] ss = new String[s1.length];
for(String s2 : s1) {
//获取最后一个数字
String s3 = s2.charAt(s2.length()-1)+"";
int s4 = Integer.parseInt(s3);
//删除数字
s2 = s2.substring(0,s2.length()-1);
ss[s4-1] = s2;
}
String end = "";
for(String s5 : ss) {
end += s5+" ";
}
return end.trim();
}
}
2、上升下降字符串(简单)
第一种方法:
先将原字符串排序,然后再按照题目的描述顺序做题,效率太低
public class lian_02 {
public static void main(String[] args) {
String s = "aaaabbbbcccc";
System.out.println(sortString(s));
}
public static String sortString(String s) {
String result = "";
while(s.length()>0) {
char[] c = s.toCharArray();
s = sort(c);
//ss存放剩余的字符
String ss = "";
result += s.charAt(0);
s = s.replaceFirst(s.charAt(0)+"", "");
for(int i=0; i<s.length(); i++) {
if(s.charAt(i)>result.charAt(result.length()-1)) {
result += s.charAt(i);
}else {
ss += s.charAt(i);
}
}
s = ss;
ss = "";
if(s.length()==0) {
break;
}
result += s.charAt(s.length()-1);
s = s.replaceFirst(s.charAt(s.length()-1)+"", "");
for(int i=s.length()-1; i>=0; i--) {
if(s.charAt(i)<result.charAt(result.length()-1)) {
result += s.charAt(i);
}else {
ss += s.charAt(i);
}
}
s = ss;
}
return result;
}
//对s进行排序
public static String sort(char[] c) {
for(int i=0; i<c.length-1; i++) {
for(int j=0; j<c.length-1; j++) {
if(c[j]>c[j+1]) {
char x = c[j];
c[j] = c[j+1];
c[j+1] = x;
}
}
}
String s = "";
for(int i=0; i<c.length; i++) {
s += c[i];
}
return s;
}
}
第二种方法:
package paixu;
public class lian_02_2 {
public static void main(String[] args) {
String s = "aaaabbbbcccc";
System.out.println(sortString(s));
}
public static String sortString(String s) {
int[] a = new int[26];
for(int i=0; i<s.length(); i++) {
a[s.charAt(i)-'a']++;
}
String ss = "";
int b = s.length();
while(b>0) {
for(int i=0; i<26; i++) {
if(a[i]>0) {
ss += (char)('a'+i);
a[i]--;
b--;
}
}
for(int i=25; i>=0; i--) {
if(a[i]>0) {
ss += (char)('a'+i);
a[i]--;
b--;
}
}
}
return ss;
}
}
3、重新排列字符串(简单)
由题可知indices中每个索引是字母在 s 中的位置,索引值是字母应该在的位置,定义一个数组num,索引代表应该在的位置,索引值代表 s 中的位置。
package paixu;
public class lian_03_2 {
public static void main(String[] args) {
String s = "codeleet";
int[] indices = {4,5,6,7,0,2,1,3};
System.out.println(restoreString(s, indices));
}
public static String restoreString(String s, int[] indices) {
char[] num = new char[indices.length];
for(int i=0; i<indices.length; i++) {
char c = s.charAt(i);
int j = indices[i];
num[j] = c;
}
return new String(num);
}
}
4、两个数组的交集(简单)
第一种方法:
1、用Arrays的sort 方法对两个数组进行排序
2、定义两个指针 n1、n2 和 一个字符串 s 存放交集
3、遍历数组,将交集放入 s
4、判断 s 是否为 "",不是就将每个值存放到新的数组中
package paixu;
import java.util.Arrays;
public class lian_04 {
public static void main(String[] args) {
int[] nums1 = {1,2,2,1};
int[] nums2 = {2,2};
System.out.println(Arrays.toString(intersection(nums1, nums2)));
}
public static int[] intersection(int[] nums1, int[] nums2) {
int n1 = 0;
int n2 = 0;
Arrays.sort(nums1);
Arrays.sort(nums2);
String s = "";
while(n1<nums1.length && n2<nums2.length) {
if(nums1[n1]==nums2[n2]) {
if(!s.contains(nums1[n1]+",")) {
s += nums1[n1]+",";
}
n1++;
n2++;
}else if(nums1[n1]<nums2[n2]) {
n1++;
}else {
n2++;
}
}
if(s.trim().length()!=0) {
String[] s2 = s.split(",");
int[] num = new int[s2.length];
for(int i=0; i<s2.length; i++) {
num[i] = Integer.parseInt(s2[i]);
}
return num;
}else {
return new int[0];
}
}
}
第二种方法:
1、哈希集合来存放两个数组,去除了重复的元素
2、将两个 set的交集放入新创建的集合中
3、将集合转化成数组
package paixu;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class lian_04_2 {
public static void main(String[] args) {
int[] nums1 = {1,2,2,1};
int[] nums2 = {2,2};
System.out.println(Arrays.toString(intersection(nums1, nums2)));
}
public static int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
Set<Integer> set3 = new HashSet<>();
for(int n : nums1) {
set1.add(n);
}
for(int n : nums2) {
set2.add(n);
}
for(Integer n : set1) {
if(set2.contains(n)) {
set3.add(n);
}
}
int[] num = new int[set3.size()];
int index = 0;
for(Integer n : set3) {
num[index++] = n;
}
return num;
}
}
5、根据数字二进制下1的数目排序(简单)
1、将arr 排序,创建数组 num ,存放0~arr最大数的每个数1的个数
2、根据num找到arr每个数的1的个数,再用希尔排序法进行排序
package paixu;
import java.util.Arrays;
public class lian_05 {
public static void main(String[] args) {
int[] arr = {0,1,2,3,4,5,6,7,8};
System.out.println(Arrays.toString(sortByBits(arr)));
}
public static int[] sortByBits(int[] arr) {
Arrays.sort(arr);
int len = arr.length;
int[] num = new int[arr[len-1]+1];
num[0] = 0;
for(int i=1; i<=arr[len-1]; i++) {
if(i%2!=0) {
num[i] = num[i-1]+1;
}else {
num[i] = num[i/2];
}
}
int h = 1;
while(h<len/2) {
h = h*2+1;
}
while(h>=1) {
for(int i=h; i<len; i++) {
for(int j=i; j>=h; j-=h) {
if(num[arr[j-h]]>num[arr[j]]) {
swap(arr, j-h, j);
}else if(num[arr[j-h]]==num[arr[j]]) {
if(arr[j-h]>arr[j]) {
swap(arr, j-h, j);
}else {
break;
}
}else {
break;
}
}
}
h = h/2;
}
return arr;
}
//交换
public static void swap(int[] arr,int i,int j) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}