找反复数字问题
public class Algo1 { public static void main(String[] args) { int[] arr = new int[101]; create(arr);//构建乱序数组 method1(arr); method2(arr); for(int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } /** * 方案1: * 题目中指明了0~99这99个数是肯定会出现的。那么非常easy。仅仅要我们遍历数组。然后求和。将和减去0累加到99的和,之差即为反复的数 */ public static void method1(int[] arr) { int sum = 0; for(int i = 0; i < arr.length; i++) { sum += arr[i]; } int constant = 0; for(int j = 0; j < 100; j++) { constant += j; } int value = sum - constant; System.out.println("反复数字为:"+value); } /** * 方案2: * 能够利用异或运算的特性: a^b^b = a * 即一个数两次异或还有一个数还等于这个数本身 * -------------------------- * 仅仅要我们遍历数组,让第一个数与后面全部数异或,将结果再依次与0~99全部数异或结果即为反复的数 */ public static void method2(int[] arr) { for(int i = 1; i < arr.length; i++) { arr[0] = arr[0]^arr[i]; } for(int i = 0; i <= 99; i++) { arr[0] = arr[0]^i; } System.out.println("反复数字为:"+arr[0]); } /** * 创建题设所要求的数组 */ public static void create(int[] arr) { for(int i = 0; i < arr.length; i++) { arr[i] = i; } arr[100] = 93;//反复的数字 int temp,num1,num2; //乱序 for(int j = 0; j < 1000; j++) { num1 = (int) (Math.random()*101); num2 = (int) (Math.random()*101); temp = arr[num1]; arr[num1] = arr[num2]; arr[num2] = temp; } } }
数组中的数字是乱序的,如今从中随机取出一个数字并替换成0~99中的还有一个数字,
试找到这个反复数字
public class Algo2 { public static void main(String[] args) { int[] arr = new int[100]; create(arr); for(int i = 0; i < 100; i++) { System.out.print(arr[i]+" "); } System.out.println("\n"); System.out.println("反复数字为:"+method(arr)); } /** * 解决方式: * 构建一个和原数组大小一致的暂时数组,用于记录每一个索引位所代表的数据出现的次数, * 比方temp[5] = 2,表示5这个数字出现了两次。* 通过遍历一次数组就可以得到结果. */ public static int method(int[] arr) { int[] temp = new int[arr.length]; for(int i = 0; i < arr.length;i++) { temp[arr[i]]++; if(temp[arr[i]] == 2) { return arr[i]; } } return -1; } /** * 构建题设所要求的数组 */ public static void create(int[] arr) { for(int i = 0; i < arr.length; i++) { arr[i] = i; } int num1,num2,temp; for(int i = 0; i < 1000; i++) { num1 = (int) (Math.random()*100); num2 = (int) (Math.random()*100); temp = arr[num1]; arr[num1] = arr[num2]; arr[num2] = temp; } do { num1 = (int) (Math.random()*100); num2 = (int) (Math.random()*100); }while(num1 == num2); arr[num1] = arr[num2]; System.out.println("反复数字为:"+arr[num1]); } }
相关文章
- TextBox只能输入数字
- 2023 数字IC设计秋招复盘——数十家公司笔试题、面试实录
- 面经-2023-哲库Zeku-数字芯片设计
- Google Earth Engine ——数据全解析专辑(SRTM Digital Elevation Data Version 4)数字高程数据集
- Android中自定义Textview解决文字和数字换行不整齐
- LeetCode高频题66. 加一,给你一个数组表示数字,则加1返回结果
- 【C语言】写一个函数,输入一个N位数,将这个N位数每两个数字之间插入一个空格并输出。例如输入1234,则输出1 2 3 4
- 只能输入数字|只能输入数字或者小数|只能输入字母和汉字|只能输入数字和字母不能是中文……
- 【数字IC验证快速入门】38、UVM项目实践之APB_SPI(6)工厂机制(factory)机制深入
- MongoDB数字类型保留2位小数
- [LeetCode] 509. Fibonacci Number 斐波那契数字
- java正则 密码包含数字、小写字母、大写字母、特殊符号4类中的至少3类
- CAD标注数字太小怎么调节?CAD标注设置技巧
- Java进行数字计算 BigDecimal计算(加减乘除)