java实现求只出现一次的数字

目录
  • 题目:
  • 思路1:
  • 思路2:

题目:

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例1:

示例2:

示例3:

异或运算的特点:

1.任何数和0做异或运算,结果还是原来那个数字,即a^0=a

2.任何数和本身做异或运算,结果为0,即a^a=0

3.异或运算满足交换律和结合律

思路1:

因为本题中的元素只有出现一次和两次的情况,所以我们用异或运算,来判断数字是出现一次还是两次。在singleNumber()方法中,定义一个int类型变量singleNumber=0,然后遍历数组,依次和singleNumber进行异或运算,最后返回singleNumber即可。

如果两个数相同,异或结果为0;

如果两个数不同,异或结果为1;

比如

输入[1,2,2],singleNumber初始化为0

singleNumber为0,和1进行异或运算结果为1;

singleNumber为1,和2进行异或运算结果为3;

singleNumber为3,和2进行异或运算结果为1;

package Lq_算法练习;

import java.util.Scanner;

public class Demo_只出现一次的数字 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        String[] strArray = str.split(",");
        //键盘输入数组,数字之间用","隔开
        int[] nums = new int[strArray.length];
        for(int i=0;i<nums.length;i++) {
            nums[i]=Integer.parseInt(strArray[i]);
            //将strArray[i]转换成整型类型,并赋值给nums[i]
        }
        int result = singleNumber(nums);
        System.out.println("只出现一次的数字为:"+result);
    }
    public static int singleNumber(int[] nums) {
        int singleNumber = 0;
        //增强型for循环,for(类型 变量:数组),最后输出的是num
        /*
        相当于
        for(int i=0;i<arr.length;i++){
        int num = arr[i];
        ...
        }
        */
        for (int num : nums) {
            singleNumber ^= num;//异或运算,转化为二进制再进行运算
            System.out.println("num="+num);
            System.out.println(singleNumber);
        }
        return singleNumber;
    }
}

运行结果:

思路2:

直接在main方法中输入数组,再将数组传入singleNumber()方法中,得出只出现一次的数字,最后输出。

package Lq_算法练习;

import java.util.Scanner;

public class Demo_只出现一次的数字 {
    public static void main(String[] args) {
        int[] array = { 1, 2, 2 };
        System.out.println("只出现一次的数字为:"+singleNumber(array));

    }

    public static int singleNumber(int[] array) {
        int tmp = 0; // array[0];
//使用简单的for循环
        for (int i = 0; i < array.length; i++) {// for (int i = 1; i < array.length; i++) {//少一次^
            tmp = tmp ^ array[i];
        }
        return tmp;
    }
}

运行结果:

到此这篇关于java实现求只出现一次的数字的文章就介绍到这了,更多相关java求只出现一次数字内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈java对象转json,数字精确出现丢失问题

    现象 java中的大数字比如18/19位的整数(long),转为json,输出到页面后,就出现精度丢失,如果数字再大些就会出现科学计数法. 这两个问题都不是json工具包(比如Gson)的问题,而是由于js存储大数字丢失精度引起. 1.精度丢失例子:当js表达整数时,最多表达15位数字,如果超过15位就会出现精度丢失问题. 援引js文档: 精度 整数(不使用小数点或指数计数法)最多为 15 位. 最后几位都变为0,丢失精度 var x = 1234567890123456999; console

  • java实现统计字符串中大写字母,小写字母及数字出现次数的方法示例

    本文实例讲述了java实现统计字符串中大写字母,小写字母及数字出现次数的方法.分享给大家供大家参考,具体如下: public class TestSubstring { public static void main(String[] args) { getCount("adsJKJ3K21AfaAD134F13241d134134s141faAAFDF"); } //统计字符串中,大写字母,小写字母,数字出现的次数 public static void getCount(String

  • 基于Java代码实现数字在数组中出现次数超过一半

    下文通过几种方法给大家介绍java数组数字出现次数,具体内容如下所示: 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散列表的方式,也就是统计每个数组出现的次数,输出出现次数大于数组长度的数字. 方法三: 出现的次数超过数组长度的一半,表明这个数字出现的次数比其他数出现的次数的总和还多. 考虑每次删除两个不同的数,那么在剩下的数中,出现的次数仍然超过总数的一般,不断重复该过程,排除掉其他的数,最终找到那个出现次数超过

  • Java C++解决在排序数组中查找数字出现次数问题

    目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 统计一个数字在排序数组中出现的次数. 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: 2 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: 0 提示: 0 <= nums.length <= 10^5 -10^9 <= nums[i] <= 10^9 nums 是一个非递减数组 -10^9 <= target &l

  • java实现求只出现一次的数字

    目录 题目: 思路1: 思路2: 题目: 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 示例1: 示例2: 示例3: 异或运算的特点: 1.任何数和0做异或运算,结果还是原来那个数字,即a^0=a 2.任何数和本身做异或运算,结果为0,即a^a=0 3.异或运算满足交换律和结合律 思路1: 因为本题中的元素只有出现一次和两次的情况,所以我们用异或运算,来判断数字是出现一次还是两次.在singleNumber()方法中,定义

  • Java实现求数组最长子序列算法示例

    本文实例讲述了Java实现求数组最长子序列算法.分享给大家供大家参考,具体如下: 问题:给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱) 例如:给定一个长度为8的数组A{1,3,5,2,4,6,7,8},则其最长的单调递增子序列为{1,2,4,6,7,8},长度为6. 思路1:第一眼看到题目,很多人肯定第一时间想到的是LCS.先给数组排个序形成新数组,然后再把新数组和原数组拿来求LCS,即可得到答案.这种解法很多人能想得到,所以就不再赘述. 思路2:按照思路1的

  • java字符串求并集的方法

    本文实例讲述了java字符串求并集的方法.分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: String[] arr1 = {"abcd", "dfg", "abc"}; String[] arr2 = {"abcd", "ccd", "df", "d", "abc"}; String[] result_union = union(

  • java实现求两个字符串最长公共子串的方法

    本文实例讲述了java实现求两个字符串最长公共子串的方法.分享给大家供大家参考,具体如下: 这个是华为OJ上的一道题目.首先,如果我们用java写代码,华为OJ有以下三条规则需遵守,否则编译无法通过或者用例无法通过,规则如下: (1)一定不可以有包名: (2)主类名只能为Main: (3)不可以输出与结果无关的信息. 好了,按照以上规则,我们写出来的代码如下(此代码不是最优的,只是用来记录华为OJ上java代码的书写规则): import java.util.Scanner; public cl

  • Java编程求二叉树的镜像两种方法介绍

    给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像. 仔细分析这两棵树的特点,看看能不能总结出求镜像的步骤.这两棵树的根节点相同,但他们的左右两个子节点交换了位置.因此我们不妨先在树中交换根节点的两个子节点,就得到了下面一幅图中的第二颗树 解法1(递归) 思路1:如果当前节点为空,返回,否则交换该节点的左右节点,递归的对其左右节点进行交换处理. /*class TreeNode{ int val; TreeNode left=null; TreeNode right=null;

  • java编程求二叉树最大路径问题代码分析

    题目: Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example: Given the below binary tree, 1 / \ 2 3 Return 6. 节点可能为负数,寻找一条最路径使得所经过节点和最大.路径可以开始和结束于任何节点但是不能走回头路. 这道题虽然

  • Java实现求子数组和的最大值算法示例

    本文实例讲述了Java实现求子数组和的最大值算法.分享给大家供大家参考,具体如下: 一般C和C++在算法实现中使用较多,下面我们通过java语言实现算法,更有亲切感. 题目: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18. 实现代码: package arrDe

  • Java中求最大值的4种方法实例代码

    前言 本文主要给大家分享了关于java求最大值的4中方法,文中给出了完整的示例代码,下面话不多少了,来一起看看吧 示例代码: /** *@author Prannt *求最大值(或最小值) *本例以int数据类型为例,可指定其他数据类型 */ //方法一:直接法,求最小值类似 public class Deno05ArrayMax { public static void main(String[] args) { //数据类型可指定 int [] array = {5,15,20,30,100

  • Java 实现repalceAll只替换第二个匹配到的字符串

    String replace replaceFirst repaceAll区别 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的. replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串 replaceFirst(String regex, String rep

  • 简单分析Java的求值策略原理

    形参和实参 java在定义方法时可以设置参数,参数分为形参和实参,形参是指在定义函数时用于接收外部传入数据的参数,而实参是指在调用方法时主调函数向被调函数传递的数据参数. 例如: public class Main { public static void main(String[] args) { int a = 2; int b = 3; System.out.println(sum(a,b));//5 } private static int sum(int i1,int i2){ ret

随机推荐