力扣百题斩—— 排序篇(一)

目录

 

1、将句子排列(简单)

2、上升下降字符串(简单)

第一种方法:

第二种方法:

3、重新排列字符串(简单)

4、两个数组的交集(简单)

第一种方法:

第二种方法:

5、根据数字二进制下1的数目排序(简单)


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;
	}

}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值