number问题
Missing Number
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n
, find the one that is missing from the array.
For example,
Given nums = [0, 1, 3]
return 2
.
Note:
Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?
解法:从1到n求和,然后依次减去数组中各元素,所得即为缺失的数。
Single Number
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解法:两个相同的数异或为0, 某个数与0异或结果即为该数。
Single Number II
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解法一:根据在特定位上为1的元素个数对3取余是否非零,逐位判断单数在特定位上是否为1。将3改为其他整数可将算法推广。
public class Solution {
public int singleNumber(int[] nums) {
if (nums.length == 0) {
return -1;
}
int result = 0;
for (int i = 0; i < 32; i++) {
int count = 0;
int d = 1 << i;
for (int j = 0; j < nums.length; j++) {
if ((nums[j] & d) != 0) {
count++;
}
}
if (count % 3 != 0) {
result |= d;
}
}
return result;
}
}
解法二:
可以使用掩码变量:
ones
代表第i th 位只出现一次的掩码变量twos
代表第i th 位只出现两次次的掩码变量threes
代表第i th 位只出现三次的掩码变量
当第 i th 位出现3次时,就 ones
和 twos
的第 i th 位设置为0. 最终的答案就是 ones。
public class Solution {
public int singleNumber(int[] nums) {
if (nums.length == 0) {
return -1;
}
int ones = 0, twos = 0, threes = 0;
for (int i = 0; i < nums.length; i++) {
twos |= ones & nums[i];
ones ^= nums[i];
threes = ones & twos;
ones &= ~threes;
twos &= ~threes;
}
return ones;
}
}
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) {
if (nums.length == 0 || nums.length == 1) {
return null;
}
int xor = 0;
for (int i = 0; i < nums.length; i++) {
xor ^= nums[i];
}
int lowbit = xor & (-xor);
int rst1 = 0;
int rst2 = 0;
for (int i = 0; i < nums.length; i++) {
if ((nums[i] & lowbit) == 0) {
rst1 ^= nums[i];
} else {
rst2 ^= nums[i];
}
}
int[] result = {rst1, rst2};
return result;
}
}
Majority Element
Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋
times.
You may assume that the array is non-empty and the majority element always exist in the array.
解法一:
public class Solution {
public int majorityElement(int[] num) {
if(num.length==1){
return num[0];
} Arrays.sort(num); int prev=num[0];
int count=1;
for(int i=1; i<num.length; i++){
if(num[i] == prev){
count++;
if(count > num.length/2) return num[i];
}else{
count=1;
prev = num[i];
}
} return 0;
}
}
解法二:
public int majorityElement(int[] num) {
if (num.length == 1) {
return num[0];
} Arrays.sort(num);
return num[num.length / 2];
}
解法三:
public int majorityElement(int[] nums) {
int result = 0, count = 0; for(int i = 0; i<nums.length; i++ ) {
if(count == 0){
result = nums[i];
count = 1;
}else if(result == nums[i]){
count++;
}else{
count--;
}
} return result;
}
Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
解法:设置两个选举数,经过一次遍历选出出现频率最大的两个数,再进行一次遍历判断它们的出现次数是否大于⌊ n/3 ⌋
public class Solution {
public List<Integer> majorityElement(int[] nums) {
List<Integer> result = new ArrayList<Integer>();
int r1 = 0;
int r2 = 0;
int count1 = 0;
int count2 = 0;
for (int i = 0; i < nums.length; i++) {
if (r1 == nums[i]) {
count1++;
} else if (r2 == nums[i]) {
count2++;
} else if (count1 == 0) {
r1 = nums[i];
count1 = 1;
} else if (count2 == 0) {
r2 = nums[i];
count2 = 1;
} else {
count1--;
count2--;
}
}
count1 = 0;
count2 = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == r1) {
count1++;
} else if (nums[i] == r2) {
count2++;
}
}
if (count1 > nums.length / 3) {
result.add(r1);
}
if (count2 > nums.length / 3) {
result.add(r2);
}
return result;
}
}
注意:选举过程中判断某个元素是否跟两个当前选举数相等和两个count数是否为零的先后顺序不能颠倒。
譬如改为:
for (int i = 0; i < nums.length; i++) {
if (count1 == 0) {
r1 = nums[i];
count1 = 1;
} else if (r1 == nums[i]) {
count1++;
} else if (count2 == 0) {
r2 = nums[i];
count2 = 1;
} else if (r2 == nums[i]) {
count2++;
} else {
count1--;
count2--;
}
}
此段在leetcode上会通过,但是事实上当数组输入为[1,2,2,3,2,2,4,5,6,7]时,在eclipse中输出结果为[]。而正确结果应该为[2].
number问题的更多相关文章
- JavaScript Math和Number对象
目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...
- Harmonic Number(调和级数+欧拉常数)
题意:求f(n)=1/1+1/2+1/3+1/4-1/n (1 ≤ n ≤ 108).,精确到10-8 (原题在文末) 知识点: 调和级数(即f(n))至今没有一个完全正确的公式, ...
- Java 特定规则排序-LeetCode 179 Largest Number
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- Eclipse "Unable to install breakpoint due to missing line number attributes..."
Eclipse 无法找到 该 断点,原因是编译时,字节码改变了,导致eclipse无法读取对应的行了 1.ANT编译的class Eclipse不认,因为eclipse也会编译class.怎么让它们统 ...
- 移除HTML5 input在type="number"时的上下小箭头
/*移除HTML5 input在type="number"时的上下小箭头*/ input::-webkit-outer-spin-button, input::-webkit-in ...
- iOS---The maximum number of apps for free development profiles has been reached.
真机调试免费App ID出现的问题The maximum number of apps for free development profiles has been reached.免费应用程序调试最 ...
- 有理数的稠密性(The rational points are dense on the number axis.)
每一个实数都能用有理数去逼近到任意精确的程度,这就是有理数的稠密性.The rational points are dense on the number axis.
- [LeetCode] Minimum Number of Arrows to Burst Balloons 最少数量的箭引爆气球
There are a number of spherical balloons spread in two-dimensional space. For each balloon, provided ...
- [LeetCode] Number of Boomerangs 回旋镖的数量
Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of po ...
- [LeetCode] Number of Segments in a String 字符串中的分段数量
Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...
随机推荐
- 关于 <textarea ></textarea >标签在苹果微信浏览器出现 内阴影
解决方法:(去除浏览器默认的样式元素) textarea { box-shadow:0px 0px 0px rgba(0,0,0,0); -webkit-appearance:none; }
- JLOI2015 解题报告
JLOI2015 真的不愧是NOI出题组出的,题目难度够吊.不过每一道都是结论题和乱搞题真的很不好玩... T1:[JLOI2015]有意义的字符串 首先贴下popoqqq的blog吧 感性的认识就是 ...
- burp插件开发
最近这几天在写burp的插件,有一些写burp插件的流程和误区想跟大家分享一下: 第一步,打开burpsuit,打开extender页面,并将burp中自带的api代码导出,方便后续的代码开发: 第二 ...
- UCOSII时间任务块
转:http://blog.csdn.net/wchp314/article/details/5416476 uCOS-II的任务控制块 标签: uCOS-II 2009-12-01 14:45 ...
- 作为前端工程师,必须要学会的基本工具之一(AI)
由于之前工作中一直使用的都是photoshop,所以对AI软件的使用并不是很熟,导致使用过程中,遇到了困难----字体无法选中.作为前端工程师都知道,一张设计图中有很多文字,如果纯手打那简直是要累死人 ...
- 读书笔记 effective c++ Item 24 如果函数的所有参数都需要类型转换,将其声明成非成员函数
1. 将需要隐式类型转换的函数声明为成员函数会出现问题 使类支持隐式转换是一个坏的想法.当然也有例外的情况,最常见的一个例子就是数值类型.举个例子,如果你设计一个表示有理数的类,允许从整型到有理数的隐 ...
- webpack(四)处理 css\less\sass 样式
(一) 处理普通的.css 文件,需要安装 css-loader,style-loader .less 文件,需要安装 less-loader .sass 文件,需安装 less-loader np ...
- 用php做省份的三级联动 附带数据库
可以把它做成小插件的形式,以后需要,可以随时调 来看一下怎么来做 先来写个div然后,再引入js包 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
- 【Java每日一题】20170308
20170307问题解析请点击今日问题下方的"[Java每日一题]20170308"查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; ...
- WebGIS中自定义互联网地图局部注记的一种方案
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 前言 实际项目中我们经常会遇到这样一种场景:地图底图可能是互 ...