小数组数时0可以将查询结果放在数组中末位吗

漫画算法:找出缺失的整数
(点击上方公众号,可快速关注)
来源:玻璃猫@伯乐在线专栏作者
链接:/106521/
点击「阅读原文」,可和作者直接交流
小灰一边回忆一边讲述起当时面试的情景……
题目:一个无序数组里有99个不重复正整数,范围从1到100,唯独缺少一个整数。如何找出这个缺失的整数?
创建一个HashMap,以1到100为键,值都是0 。然后遍历整个数组,每读到一个整数,就找到HashMap当中对应的键,让其值加一。
由于数组中缺少一个整数,最终一定有99个键对应的值等于1, 剩下一个键对应的值等于0。遍历修改后的HashMap,找到这个值为0的键。
假设数组长度是N,那么该解法的时间复杂度是O(1),空间复杂度是O(N)。
先把数组元素进行排序,然后遍历数组,检查任意两个相邻元素数值是否是连续的。如果不连续,则中间缺少的整数就是所要寻找的;如果全都连续,则缺少的整数不是1就是100。
假设数组长度是N,如果用时间复杂度为O(N*LogN)的排序算法进行排序,那么该解法的时间复杂度是O(N*LogN),空间复杂度是O(1)。
很简单也很高效的方法,先算出1+2+3….+100的和,然后依次减去数组里的元素,最后得到的差,就是唯一缺失的整数。
假设数组长度是N,那么该解法的时间复杂度是O(N),空间复杂度是O(1)。
题目扩展:一个无序数组里有若干个正整数,范围从1到100,其中99个整数都出现了偶数次,只有一个整数出现了奇数次(比如1,1,2,2,3,3,4,5,5),如何找到这个出现奇数次的整数?
遍历整个数组,依次做异或运算。由于异或在位运算时相同为0,不同为1,因此所有出现偶数次的整数都会相互抵消变成0,只有唯一出现奇数次的整数会被留下。
假设数组长度是N,那么该解法的时间复杂度是O(N),空间复杂度是O(1)。
题目第二次扩展:一个无序数组里有若干个正整数,范围从1到100,其中98个整数都出现了偶数次,只有两个整数出现了奇数次(比如1,1,2,2,3,4,5,5),如何找到这个出现奇数次的整数?
遍历整个数组,依次做异或运算。由于数组存在两个出现奇数次的整数,所以最终异或的结果,等同于这两个整数的异或结果。这个结果中,至少会有一个二进制位是1(如果都是0,说明两个数相等,和题目不符)。
举个例子,如果最终异或的结果是5,转换成二进制是。此时我们可以选择任意一个是1的二进制位来分析,比如末位。把两个奇数次出现的整数命名为A和B,如果末位是1,说明A和B转为二进制的末位不同,必定其中一个整数的末位是1,另一个整数的末位是0。
根据这个结论,我们可以把原数组按照二进制的末位不同,分成两部分,一部分的末位是1,一部分的末位是0。由于A和B的末位不同,所以A在其中一部分,B在其中一部分,绝不会出现A和B在同一部分,另一部分没有的情况。
这样一来就简单了,我们的问题又回归到了上一题的情况,按照原先的异或解法,从每一部分中找出唯一的奇数次整数即可。
假设数组长度是N,那么该解法的时间复杂度是O(N)。把数组分成两部分,并不需要借助额外存储空间,完全可以在按二进制位分组的同时来做异或运算,所以空间复杂度仍然是O(1)。
十分钟后……
以上就是小灰面试的情况……
点击「阅读原文」,可和作者直接交流
玻璃猫:互联网公司的码农一枚,喜欢算法和面向对象设计。个人微信号: 个人订阅号:dreamsee321欢迎一起交流讨论!
打赏支持作者写出更多好文章,谢谢
关注「算法爱好者」
看更多精选算法技术文章
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点将任意整数数组中的0都都放在数组最后 - CSDN博客
将任意整数数组中的0都都放在数组最后
题目描述:从键盘任意输入一个整数数字,将此整数数组中所有包含的0都放在数组的最后,非0项顺序不变(Java实现)
算法描述: & 1.首先要先找到此数组中的第一个为0项,并将此项下标值赋给k,再找到k后的第一个非0项,并将此项的下标值
& 赋给i,此时,调换下标为K和i的数组的两个值,例如,6,3,0,0,7,0中,第一个0项的下标为k,此时k=1,i=2,将
& k和i的值对调,新数组即变为6,3,0,0,0,7,0;此时将k值加1,即将k向后移一位,再将i值进行循环,找到k后的
非0值,即7,此时k=2,i=5,将k和i所对应的值对调,即得到新数组:6,3,7,0,0,0,0。依次类推,直至将所有
& 的0全部移植数组的末尾。
输入描述:请输入一串整数并在输入时用英文逗号隔开:
6,0,3,0,0,7,0
程序输出: 6,3,7,0,0,0,0
程序源码:
/**************************************************************
* Copyright (c) 2016,
* All rights reserved.
* 题目描述:从键盘任意输入一个整数数字,将此整数数组中所有包含的0都放在数组的最后,非0项顺序不变
* 输入描述:请输入一串整数并在输入时用英文逗号隔开:
6,0,3,0,0,7,0
* 程序输出:6,3,7,0,0,0,0
* 问题分析:
* 算法描述:1.首先要先找到此数组中的第一个为0项,并将此项下标值赋给k,再找到k后的第一个非0项,并将此项的下标值
赋给i,此时,调换下标为K和i的数组的两个值,例如,6,3,0,0,7,0中,第一个0项的下标为k,此时k=1,i=2,将
k和i的值对调,新数组即变为6,3,0,0,0,7,0;此时将k值加1,即将k向后移一位,再将i值进行循环,找到k后的
非0值,即7,此时k=2,i=5,将k和i所对应的值对调,即得到新数组:6,3,7,0,0,0,0。依次类推,直至将所有
的0全部移植数组的末尾。
2.从键盘输入一个任意数组的方法:
(1)调用java的Scanner方法,通过System.in输入一个字符串,
(2)将输入的字符串用split()函数将字符串拆分成数组,
(3)将字符串数组s[]中的字符串通过Integer.parseInt(s[i])转化为整数数组,并存储在arr数组中;
&span style=&white-space:pre&& &/span&Scanner sc = new Scanner(System.in);
System.out.println(&请输入一串整数并在输入时用英文逗号隔开:&);
String str = sc.next().toString();
String s[] = str.split(&,&);
int[] arr = new int[s.length];
for(int i=0; i&arr.i++){
arr[i] = Integer.parseInt(s[i]);
* 3.通过Array.printSample(Array.findSample(arr));方法将数组arr传入到处理函数findSample(int[]a)中,
在此函数中进行数组的重新排序。
***************************************************************/
package org.marsguo.
import java.util.S
class Array{
public static int k = 0;
//将k指向数组中的第一位
public static int[] findSample(int[] a){
//数组处理函数;查找出数字0并放在数字末尾
while(a[k] != 0){
//找到数组中的第一个0所在的下标
for(int i = k+1; i & a.i++){
//将i指向数组中k后的一位
if(a[k]==0){
if(a[i]!=0)
//找到k后第一个非0的数字。
a[k]=a[i];
//找到k后第一个非0项后,将此值和第一个0(即k所指的数字)调换
//k值加1,向后移一位
//返回重新排序后的数组
public static void printSample(int a[]){
//打印重新排序后的数组
System.out.println(&排序后的结果是:&);
for(int j = 0; j&a.j++){
System.out.print(a[j] + &,&);
public class Arr_sort{
public static void main(String args[]){
Array array = new Array();
//声明一个Array类的array对象
Scanner sc = new Scanner(System.in);
//调用Scanner方法,输入
System.out.println(&请输入一串整数并在输入时用英文逗号隔开:&);
String str = sc.next().toString();
String s[] = str.split(&,&);
//将输入的字符串用&,&分开,并存放到字符串数组s[]中
int[] arr = new int[s.length];
//声明一个和s同长度的数组arr
for(int i=0; i&arr.i++){
arr[i] = Integer.parseInt(s[i]);
//将字符串数组转化成整形数组
/*因为findSample()方法和printSample()方法为静态方法,所以可以直接使用类名.方法名来调用
而不需要声明对象。静态方法在对象创建前就已经存在了*/
//Array.findSample(arr);
Array.printSample(Array.findSample(arr));
/*也可以为:
array.findSample();
array.printSample();
此时会提示警告:The static method findSample() from the type
Array should be accessed in a static way*/
程序输出结果:
总结:1,在类中不能直接使用for语句或者if语句进行处理,要先声明方法,在方法中使用if或for,否则报错for语言前的分号“;”有问题。
本文已收录于以下专栏:
相关文章推荐
public class ArrayDemo2 {
public static void main(String[] args) {
int[] ol...
JAVA中数组的定义格式有如下三种:
第一中方式:int[] arr = new int[3];
第二种方式:int[] arr1= new int [] {1,2,3,4,5};
第三种方式:...
思路:假设这些字符存放在数组arr[0:lenth-1]
其实很早在看LINUX下就看到这个东西,后来在MFC内存池里同样也看到了类似的东西,还依照MFC写过一个类似的小内存池,(MFC用的是return this + 1)后来在李先静的《系统程序员成长计划...
11:15 | 发布者: benben |
查看数: 143 | 评论数: 0
摘要: 其实很早在看LINUX下就看到这个东西,后...
在linux源码里
struct tty_buffer {
struct tty_buffer *
char *char_buf_
unsigned char *flag_b...
文章出处:/sweetdream/archive//778308.html
在Linux系统里,/usr/includ...
在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构:structpppoe_tag {
__u16tag_len...
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)PASCAL数的统计描述 一个数“含有0”是指这个数至少某一位数字为0.小明对那些“含有0”的自然数很感兴趣,想跳出来进
PASCAL数的统计描述 一个数“含有0”是指这个数至少某一位数字为0.小明对那些“含有0”的自然数很感兴趣,想跳出来进行研究.那么,n当中“含有0”的自然数有多少个?小明想1秒钟内得到答案,你能帮他做到吗?(1
var:a,b,c:s:begin readln(a); c:=0; for b:=9 to a do begin str(b,s); if pos('0',s)0 then c:=c+1; writeln(c);end.//空行为读写文件留
与《PASCAL数的统计描述 一个数“含有0”是指这个数至少某一位数字为0.小明对那些“含有0”的自然数很感兴趣,想跳出来进》相关的作业问题
【犹抱琵琶半遮面】
var n,i,m,s :begin repeat readln(n); until (1
var i,s,n:a:array[1..200000]procedure s1(l,r:longint);var t,mid,i,j:begini:=l;j:=r;mid:=a[(i+j) div 2];repeatwhile a[i]mid do dec(j)
这个不算了,那是无穷多的,光个位是5的整数有多少你就数不过来
function isOk(n :integer) :vari :beginresult := pos('5',inttostr(n))>0;function myFunc(n:integer) :vari :beginresult := 0 ;f
for i:=1 to 总数量 do begin write(a[i]:4); if i mod 10=0 再问: 总数量是符合要求的数的数量吗? 再答: 是的,把符合的数都存放在一个数组中再问: 那a是什么数据类型?你能把整个问题的程序给我吗? 再答: 其实也可以不用数组。。。。。
∵分数的分子分别是:2 2=4,23=8,24=16,…分数的分母分别是:2 2+3=7,23+3=11,24+3=19,…∴第n个数是2^n/ 2n+3 .故答案为:2^n/ 2n+3 . 再问: 2^n是啥意思? 再答: 就是2的n次方
(1+n)*n/2=888 (1+n)*n=*42+4)*41/2+27重复的是27.
有些错误,改正如下:Private Sub Command1_Click()Dim i As Integerm = 0i = 100Do While i
小明报了 600/5 = 120组,每组数字和=1+2+……+5 = 15小花报了 600/6 = 100组,每组数字和=1+2+……+6 = 21小花报的数字之和比小明报的数之和多= 21*100 - 15*120= 300
dim i ,a,b,total As Integer for a =0 to 9 for b =0 to 9 if (800+a*10+b) mod 3 =0 Then print (800+a*10+b) total =total +1 end if next b next a (未完,手机有字数限制)
解设这个三位数的个位为x,则百位x+1,十位14-(x+x+1)=13-2x即这个三位数为100(x+1)+10(13-2x)+x=81x+230由于81x+230是11的倍数则x=3即地球上火山的个数81*3+230=473
设大的加数为X则 X+X/10=0X=300这两个数是30和300
解题思路: 先找出商的变化规律,即商的末位是怎样循环的,然后再解答即可。解题过程: 11÷6=1............3......=1851......5......由此可知,商的末位是1、8、5的循环,(1111-1)÷3=因为没有余数,所
Var n,i: s: Begin readln(n); For i:=1 to n do if i mod 3=0 Then Begin//若能被3整除 str(i,s);//将i转换为字符串 if pos('5',s)>0 Then writeln(i);//利用字符串函数pos判断是
加个变量count,初始是0,当满足if条件的时候count++;跳出for循环之后输出count
由题目,可以看出第一个数1/2=(1×2-1)/(1²+1),第二个数3/5=(2×2-1)/(2²+1) 第三个数5/10=(3×2-1)/(3²+1) 由此可以看出,第n个数为(2n-1)/(n²+1)
2n\2n+3 望采纳 再问: 讲一下怎么得出来的 再答: 要过程吗。 分子都是2的倍数 第几个数就是几乘2 分母都比分子大三 所以分数为2n\2n+3推荐这篇日记的豆列
&&&&&&&&&&&&sponsored links
有一个数组a1000存放01000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以7个数为例:{0,1,2,3,4,5,6,7} 0--&1--&2(删除)--&3--&4--&5(删除)--&6--&7--&0(删除),如此循环直到最后一个数被删除。
#include &iostream&
struct Node
int main()
Node a[1001];
int i,n = 1000;
for (i = 0; i & ++i)
a[i].value =
a[i].isDeleted =
int cur = 0,count,num =
while (num != 1)
count = 0;
while (count != 2)
cur = (cur+1)%n;
if (a[cur].isDeleted == false)
a[cur].isDeleted =
// cout&&a[cur].value&&"
while (a[cur].isDeleted != false)
cur = (cur+1)%n;
cout && cur &&
system("pause");
有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置.以7个数为例:{0,1,2,3,4,5,6,7} 0--&1--&2(删除)--&3--&4--&5(删除)--&6--&7--&0(删除),如此循环直到最后一个数被删除.
声明一个数组来存放一系列的指针,而这些指针的数据类型不完全相同,想到一种想法,这种情况我们可以定义一个这样的结构,这个结构包含一个整数存放指针的值,一个字符串表明指针的类型.声明一个存放这种结构的元素的数组,可以解决这种问题.
近期项目中遇到一个需求,从一个列表中随机展示列表的部分内容,需求不大,JS也非常容易实现.主要是运用到了Math对象的random方法,和Array的splice方法. 思路是先新建一个数组,存放所有的列表,然后算出随机数,从数组中取出这个随机索引对应的值,然后组成一个随机数组.
源代码如下: 1 &!DOCTYPE html& 2 & ...
针对上篇博文中方法二的问题,这里我们提供一个方法来解决所出现的空间浪费的问题 上篇博文见:一个数组实现三个栈(1) 方法二加强版:下面就针对这个问题对程序进行进一步的修改. 1.每次 pop 出栈之后,检查压出元素位置是否小于当前数组总索引,如果是,则将总索引指向压出元素位置,就是指向刚弹出后留下的空位置,否则表示总索引位置在压出元素位置之前,那么就不需要进 ...
--------------------------------------------------- 2345王牌技术员联盟.2345王牌技术员联盟.期待与您交流!---------------------------------------------------------方法1: using Susing System.Collectio ...

我要回帖

更多关于 将查询结果放在数组中 的文章

 

随机推荐