Single Number I+II+III

本文介绍了几种寻找数组中唯一出现一次元素的算法解决方案,包括线性时间和常数空间复杂度的实现方法。针对不同场景(一次、两次、三次出现的情况),提供了具体的Java代码示例,如使用位操作技巧进行高效求解。

Expected:linear runtime complexity, constant space complexity.(像当初的我直接用关联容器暴力解决…)

Single Number I

Given an array of integers, every element appears twice except for one. Find that single one.

public class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for(int i=0;i<nums.length;i++)
            result = result ^ nums[i];
        return result;
    }
}
//只有这道完全是自己想到的...因为想到一种用位操作实现两数互换的方法(不需要用temp):
// A = A^B;
// B = A^B;
// A = A^B;

Single Number II

Given an array of integers, every element appears three times except for one. Find that single one.

//方法一(Single Number I也可以用)
//统计数组中的数字每一位上'1'的个数,对3取余即可得到SingleNumber在该位是'0'还是'1'
public class Solution {
    public int singleNumber(int[] nums) {
        int temp;
        int result = 0;
        for(int i=0;i<32;i++){
            temp = 0;
            for(int j=0;j<nums.length;j++){
                temp += (nums[j]>>i)&1;
            }
            temp %= 3;
            result |= (temp<<i);
        }

        return result;
    }
}

//方法二:amazing...
public class Solution {
    public int singleNumber(int[] nums) {
        int one=0;
        int two=0;
        int i,j,k;
        //其中的one代表目前为止number出现了一次
        //two代表出现了两次
        //three代表出现了三次
        for(i=0; i<nums.length; i++)
        {
            two = two |(one&nums[i]);//当one为'1'时,two为'1'(已经出现过一次,现在又出现一次),当one为‘0’时,two不变
            one = one^nums[i];//出现了奇数次则为非0

            int three = two&one;
            two = two^three; //当one和two都达到非零时,用three将two置零
            one = one^three; //用three将one置零
        }

        return one|two;
    }
}

Single Number III

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

public class Solution {
    public int[] singleNumber(int[] nums) {
        int attempt = 0;
        for(int i=0;i<nums.length;i++){
            attempt ^= nums[i];//得到两个结果的异或
        }
        //如何把二者分离?
        //找到异或结果中某位为'1'的位置,然后将原数组中此位为'1'的分为一类,为'0'的分为一类
        //为了计算考虑,通常寻找最后一个'1'的位置,而且有一个很巧妙的公式:
        int lastOne = attempt & (~(attempt-1));
        int a = 0;
        int b = 0;
        for(int i=0;i<nums.length;i++){
            if( (nums[i]&lastOne) == 0) a^=nums[i];
            else b^=nums[i];
        }

        int[] result = new int[2];
        result[0] = a;
        result[1] = b;

        return result;
    }
}
财务管理收入/支出双轨记账,精确到分支持项目关联收入(如工程款)支出分类管理(材料/人工/设备等8+类别)实时净收益计算(总收入 – 总支出)工人管理完整工人档案(姓名/电话/身份证/职位)日工资标准记录一键删除冗余记录[玫瑰]项目管理项目全周期管理(起止日期/地点/描述)项目-收入自动关联项目进度可视化跟踪[玫瑰]智能报表[玫瑰]自定义时间段统计(日/月/季度/年)收入项目分布图(条形图)支出类别饼状图动态数据图表(使用Chart.js)[玫瑰]安全系统[玫瑰]用户登录验证会话状态管理操作记录追踪(通过时间戳)核心优势一体化管理覆盖「人、钱、项目」三大核心要素,告别Excel表格碎片化管理多维度统计实时生成「项目收益分析」「工人成本占比」「支出类别排行」等关键数据[玫瑰]安全可靠[玫瑰]数据库事务保障数据一致性,每日自动备份机制(需配置cron任务)零学习成本简洁中文界面,10分钟上手,工地老师傅也能轻松操作[玫瑰]移动友好[玫瑰]自适应布局,手机/平板/电脑均可流畅使用(响应式设计)[玫瑰]扩展性强[玫瑰]支持二次开发(工资结算、考勤打卡、材料库存等模块可快速接入)技术亮点采用PHP+MySQL经典组合,稳定高效前端使用Chart.js实现动态数据可视化响应式布局适配多终端严格的表单验证机制(前端JS+后端PHP双重校验)全站统一CSS样式规范适用场景中小型建筑公司财务监管包工头/施工队独立记账工程项目成本核算工人工资结算依据甲方项目进度款追踪增值价值降本增效:自动化计算替代手工记账,减少90%对账时间风险预警:实时监控项目盈亏,超支自动标红提醒合规留痕:完整记录每笔资金流向,应对审计无忧决策支持:通过数据趋势预判工程成本,合理报价账号密码 admin 123456
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值