数组中有重复数据统计并按照次数的由大到小排列出来

此文主要是警醒自己,自己以前也写过此算法的实现,但对比下,发现还是下算法是真正的教科书式经典实现,而且下代码主要由一位MM完成,让我反省了IT行业的性别歧视。

 

中心思想:遍历数组,依次插入到二叉排序树,如果找到数字相等的,节点的count++;中序遍历算法,输出这个二叉排序树。(PS:如果想得到标准的O(Nlog2N)算法,可以通过旋转树枝的办法,减小树的高度,把二叉排序树优化为平衡二叉树。)
节点类:

package tm.cao.sort;

/**
 * 节点类
 *
 */
public class TreeNode {
	
/**
 * 关键字
 */
private int data;

/**
 * 左子树
 */
private TreeNode leftCh;

/**
 * 右子树
 */
private TreeNode rightCh;

/**
 * 关键字出现的次数 
 */
private int count;
public int getData() {
	return data;
}
public TreeNode getLeftCh() {
	return leftCh;
}
public TreeNode getRightCh() {
	return rightCh;
}
public int getCount() {
	return count;
}
public void setData(int data) {
	this.data = data;
}
public void setLeftCh(TreeNode leftCh) {
	this.leftCh = leftCh;
}
public void setRightCh(TreeNode rightCh) {
	this.rightCh = rightCh;
}
public void setCount(int count) {
	this.count = count;
}
public TreeNode(int data) {
	super();
	this.data = data;
	this.count=1;
}
public TreeNode(int data, TreeNode leftCh, TreeNode rightCh) {
	super();
	this.data = data;
	this.leftCh = leftCh;
	this.rightCh = rightCh;
	this.count = 1;
}
public TreeNode() {
	super();
}

/* 为了便于调试和输出  生成toString()
 */
@Override
public String toString() {
	return "数字=" + data + ", 出现次数=" + count + "";
}

}


二叉排序树的类:

package tm.cao.sort;

import org.junit.Test;

/**
 * 二叉排序树的类
 *
 */
public class TreeInsert {
	
/**
 * 根节点
 */
private TreeNode root;

public TreeNode getRoot() {
	return root;
}

public void setRoot(TreeNode root) {
	this.root = root;
}

/**
 * 总的方法
 */
public void createTreeAndOutPut(int[] array){
	//只需遍历一次数组 遍历的同时插入节点到排序树
	for(int data:array){
		this.insertNode(data);
	}
	//中序输出这个排序树
	this.middleOrder(root);
}

/**
 * 中序遍历 递归算法 p为当前节点的指针
 */
public void middleOrder(TreeNode p){
	if(p!=null){
		//遍历左子树
		this.middleOrder(p.getLeftCh());
		//遍历本次节点
		System.out.println(p);
		//遍历右子树
		this.middleOrder(p.getRightCh());
	}
}
/**
 * 插入单个节点的方法
 */
public void insertNode(int data){
	//如果没有根节点 创造新的根节点
	if(this.getRoot()==null){
		root=new TreeNode(data);
	}else{
		//初始化指针p指向根节点
		TreeNode p=root;
		while(true){
			//如果p的data小于data  
			if(p.getData()<data){
				//如果p没有左子树  则直接插入到p的左子树
				if(p.getLeftCh()==null){
					TreeNode leftCh=new TreeNode(data);
					p.setLeftCh(leftCh);
					break;
				}else{
					//如果p有左子树 则让指针指向p的左子树 继续遍历
					p=p.getLeftCh();
					continue;
				}
			}
			//插入右子树的情况 和左子树类似
			else if(p.getData()>data){
				if(p.getRightCh()==null){
					TreeNode rightCh=new TreeNode(data);
					p.setRightCh(rightCh);
					break;
				}else{
					p=p.getRightCh();
					continue;
				}
			}else{
				//设置重复的情况  不必插入新的节点,直接让p的count加1
				int count=p.getCount();
				count++;
				p.setCount(count);
				break;
			}
		}
	}
}

/**
 * 用于测试的类  为了程序的健壮性,我们多生成些随机数放入数组
 */
@Test
public void test(){
	TreeInsert ti=new TreeInsert();
	int[] array={3,47,43,73,86,36,96,47,36,61,46,99,69,81,62,97,74,24,67,62,42,81,14,57,20,42,53,32,37,32,16,76,2,27,66,56,50,26,71,7,32,90,79,78,53,12,56,85,99,26,96,96,68,27,31,5,3,72,93,15,55,59,56,35,64,38,54,82,46,22,31,62,43,9,90};
	ti.createTreeAndOutPut(array);
}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 将数组中的元素按照字母顺序排序。 ```javascript const arr = ['banana', 'apple', 'orange', 'grape']; const sortedArr = arr.sort(); console.log(sortedArr); // ['apple', 'banana', 'grape', 'orange'] ``` 2. 求出数组中所有元素的和。 ```javascript const arr = [1, 2, 3, 4, 5]; const sum = arr.reduce((a, b) => a + b); console.log(sum); // 15 ``` 3. 统计数组中每个元素出现的次数。 ```javascript const arr = ['apple', 'banana', 'orange', 'apple', 'banana', 'grape']; const counts = arr.reduce((acc, curr) => { if (curr in acc) { acc[curr]++; } else { acc[curr] = 1; } return acc; }, {}); console.log(counts); // {apple: 2, banana: 2, orange: 1, grape: 1} ``` 4. 去掉数组中重复元素。 ```javascript const arr = ['apple', 'banana', 'orange', 'apple', 'banana', 'grape']; const uniqueArr = [...new Set(arr)]; console.log(uniqueArr); // ['apple', 'banana', 'orange', 'grape'] ``` 5. 将数组中的元素转换为大写字母。 ```javascript const arr = ['apple', 'banana', 'orange', 'grape']; const upperCaseArr = arr.map(x => x.toUpperCase()); console.log(upperCaseArr); // ['APPLE', 'BANANA', 'ORANGE', 'GRAPE'] ``` 6. 返回数组中最大元素。 ```javascript const arr = [1, 3, 5, 2, 4]; const max = Math.max(...arr); console.log(max); // 5 ``` 7. 将数组中的元素倒序排列。 ```javascript const arr = ['apple', 'banana', 'orange', 'grape']; const reversedArr = arr.reverse(); console.log(reversedArr); // ['grape', 'orange', 'banana', 'apple'] ``` 8. 求出对象中所有属性值的和。 ```javascript const obj = {a: 1, b: 2, c: 3, d: 4}; const sum = Object.values(obj).reduce((a, b) => a + b); console.log(sum); // 10 ``` 9. 统计对象中每个属性值出现的次数。 ```javascript const obj = {a: 'apple', b: 'banana', c: 'apple', d: 'grape'}; const counts = Object.values(obj).reduce((acc, curr) => { if (curr in acc) { acc[curr]++; } else { acc[curr] = 1; } return acc; }, {}); console.log(counts); // {apple: 2, banana: 1, grape: 1} ``` 10. 将对象中所有属性值转换为大写字母。 ```javascript const obj = {a: 'apple', b: 'banana', c: 'orange', d: 'grape'}; const upperCaseObj = Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, v.toUpperCase()])); console.log(upperCaseObj); // {a: 'APPLE', b: 'BANANA', c: 'ORANGE', d: 'GRAPE'} ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值