精华内容
下载资源
问答
  • 问题: 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 例子: 思路 1. 我们将数组中所有小于等于 00 的数修改为 N+1N+1; 2.我们遍历数组中的每一个数 xx,...否则答案是第一个正数的位置 11。

    问题:

    给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。

    例子:

    在这里插入图片描述

    思路

    1. 我们将数组中所有小于等于 00 的数修改为 N+1N+1;
    
    2.我们遍历数组中的每一个数 xx,它可能已经被打了标记,
    因此原本对应的数为 |x|,其中 ∣∣ 为绝对值符号。如果 ∣x∣∈[1,N],
    那么我们给数组中的第 |x| - 1 个位置的数添加一个负号。
    注意如果它已经有负号,不需要重复添加;
    
    3.在遍历完成之后,如果数组中的每一个数都是负数,那么答案是 N+1,
    否则答案是第一个正数的位置加 11。
    

    代码:

    #include <vector>
    #include <algorithm>
    using namespace std;
    class Solution {
    private:
        int N;
    public:
        int firstMissingPositive(vector<int>& nums) {
            this->N = nums.size();
            for (int i = 0; i < N; ++i) {
                if(nums[i] <= 0)
                    nums[i] = N+1;
            }
            for (int i = 0; i < N; ++i) {
                int num = abs(nums[i]);
                if (num <= N) {
                    nums[num - 1] = -abs(nums[num - 1]);
                }
            }
            for (int i = 0; i < N; ++i) {
                if(nums[i] > 0)
                    return i+1; // 返回的是下标+1
            }
            return N+1;
        }
    };
    
    展开全文
  • 题目要求:输入一个整型数组,数组里有正数也有负数 数组中连续的一个或多个整数组成一个子数组,...数组里有正数负数,当与负数相加,如果和小于等于0,最大值等于加负数之前的和,与正数相加则等于加正数之后...

    题目要求:输入一个整型数组,数组里有正数也有负数

            数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和

            求所有子数组的和的最大值,要求时间复杂度为O(n)

    设计思想

    求出所有连续子数组的和,然后进行比较。用array[0]来作为max的初始值.数组里有正数有负数,当与负数相加,如果和小于等于0,最大值等于未加负数之前的和,与正数相加则等于加正数之后的和。

    代码:

    import java.util.Scanner;
    
    public class Array{
    
        public static void main(String[] args) {
            
            System.out.print("请输入数组的长度N=");
            Scanner scan=new Scanner(System.in);
            int length=scan.nextInt();
            int arr[]=new int[length];
            for(int i=0;i<length;i++){
                arr[i]=(int)(10-Math.random()*20);  //产生-10到10的随机数
            }
            
            int arr2[]=new int[2*length];
            for(int i=0;i<2*length;i++){
                if(i<length){
                	arr2[i]=arr[i];
                }
                else{
                    arr2[i]=arr[i-length];
                }
            }
            
            System.out.print("数组:{ ");
            for(int i=0;i<length;i++){
            	System.out.print(arr[i]+" ");
            }    
            System.out.println("}");    //输出这个数组
            
            int max=0;
            int curSum=0;
            int M[]=new int[length];
            for(int s=0;s<length;s++){
            	
            	for(int j=s;j<s+length;j++){
            		if(j==s){
            			max=arr2[j];
            			curSum=max;
            			continue;
                    }
            		if(curSum<0){
            			curSum=0;
            		}
                
            		curSum+=arr2[j];
            		if(curSum>max){
            			max=curSum;
            		}
                }
            	M[s]=max;
            }
            int LL=Largest(M,length);
            System.out.println("最大子数组的和为:"+LL);
        }
        public static int Largest(int list[],int length)
        {
            int i,max=list[0];
    
            for(i=0;i<=length-1;i++)
            {
                if(list[i]> max){
                    max=list[i];
                }
            }    
            return max;
        }
    }
    

      

     

    转载于:https://www.cnblogs.com/lzxw/p/6659896.html

    展开全文
  • 题目要求:输入一个整型数组,数组里有正数也有负数 数组中连续的一个或多个整数组成一个子数组,...数组里有正数负数,当与负数相加,如果和小于等于0,最大值等于加负数之前的和,与正数相加则等于加正数之后...

    题目要求:输入一个整型数组,数组里有正数也有负数

            数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和

            求所有子数组的和的最大值,要求时间复杂度为O(n)

    设计思想

    求出所有连续子数组的和,然后进行比较。用array[0]来作为max的初始值.数组里有正数有负数,当与负数相加,如果和小于等于0,最大值等于未加负数之前的和,与正数相加则等于加正数之后的和。

    源代码

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6     int i,n,sum=0;
     7     int array[1000];
     8     cout<<"请输入数组的长度:"<<endl;
     9     cin>>n;
    10     int max=array[0];
    11     cout<<"请输入数组内的数"<<endl;
    12     for(i=0;i<n;i++)
    13     {
    14         cin>>array[i];
    15     }
    16     for(i=0;i<n;i++)
    17     {
    18         if(sum<=0)
    19         {
    20             sum=array[i];
    21         }
    22         else 
    23         {
    24             sum=sum+array[i];
    25         }
    26         if(sum>max)
    27         {
    28             max=sum;
    29         }
    30     }
    31     cout<<"子数组和的最大值为"<<max<<endl;
    32     return 0;
    33 }

    结果截图:

    总结

    编程要善于思考,有了思路再去写,免得一直处于写了再改的模式,重在分析

    转载于:https://www.cnblogs.com/qianxia/p/5360455.html

    展开全文
  • 在处理一个很大的数组的时候,需要使用matlab将该数组中的全部元素取补码后转化成16进制。 原码取补码的最传统的方法是:正数不变,负数按位取反(最高位符号位不取反),然后1; 当然还有另一种方法:正数不变...
     
    

     

    在处理一个很大的数组的时候,需要使用matlab将该数组中的全部元素取补码后转化成16进制。

    原码取补码的最传统的方法是:正数不变,负数按位取反(最高位符号位不取反),然后加1;

    当然还有另一种方法:正数不变,负数则将其加上模值。其中的模的大小等于2的n次方(n为表示位数,含符号位)。举例来说:用四位表示的-3,其补码就等于模值16加上-3,等于13。

    于是我就用第二种方法的思路写了下面一段代码:

     

    function hexval=Compldec2hex(decval)

    if(decval>=0)

      res = decval; 

    else

      res = 2048 + decval;   

    end

    hexval = dec2hex(res);

     

    注:我用11位二进制数表示decval,所以模是2^11=2048,遇到正数不变,遇到负数就用模去加,即可得补码。

    用这个函数Compl去计算单个的数值,没问题,、

    如:

     

    >> Compldec2hex(120)

    ans =

     

    78

     

    但是在计算一个很大的数组的时候出现了问题,经过观察发现:在数组含有负数的前提下,正数在转换的时候出现问题,比如:

    >> Compldec2hex([-140,120,-130])

     

    ans =

     

    774

    878

    77E

     

    正数120被转换为878,与正确值相差0x800,也就是十进制下的2048,也就说明在数组中有负数的情况下,数组中的正数也被当作负数处理,具体原因应该是计算机默认存储数据的位宽是32位,十进制数120转化成二进制数是111 1000。若数组中不出现负数,计算机认为存储无符号数,将111 1000左补0充满32位;若数组中出现负数,计算机认为存储有符号数,将111 1000的向左扩充满32位并将最高位1扩展为第32位,即1000 0000 0111 1000,而计算机辨认一个数的正负是看其最高位(符号位)的,因为其符号位是1,所以就把120认为是负数了。一场意料之外又是情理之中的误会。

    那么,怎么“冰释”这场误会呢?我想了以下几种方法:

    1、  限定位宽,在这个具体问题里面就限制11位,但是会发现111 1000还是会被计算机符号位左扩展的,所以行不通;

    2、  多加一句if(res>2048)  res=res-2048,但是由于res>2048不能被满足,所以也行不通;

    3、  加一句res = bitand(res,2047),表示将最后的结果与011 1111 1111按位相与,即将11位置0,结果显示可行。

    展开全文
  • 输入一个整型数组,数组里有正数也有负数 数组中一个或连续的多个整数组成一个子数组 求所有子数组的和的最大值 例如输入的数组为{ 1, -2, 3, 10, -4, 7, 2, -5 } 最大的子数组为{ 3, 10, -4, 7, 2 },因此输出为该子...
  • 值得注意的是,在计算机中如果两数计算的结果是正数,那么该值就是实际计算结果,如果计算结果是负数,就需要对计算结果进行次取反的逆运算,得到实际的计算结果。 为什么在byte转int的时候都要把byte数据&...
  • 正数的补码是原码本身,负数的补码是绝对值的反码1,补码是用正数表示负数负数的补码与绝对值原码相加等于0,因为: 对于8位二进制来说,反码与原码相加一定得:1111 1111,这是因为反码是将原码的每位都取反...
  • 即:负数的二进制表示为对应正数的二进制取反1; 可是,“符号位”的规定是怎么想的?这个关于补码、反码、原码的计算方式又是怎么来的呢?当时没有细想,只是当成了一个知识点记下来了,没有什么别的体会。 今天...
  • 首先,计算机都是使用二进制的补码进行计算。   1、正数的二进制原码、反码、补码都是相同的   2、负数的二进制原码:先计算该负数...3、负数的反码:等于原码的最高位不变,其余取反。 比如-32 原码为...
  • 文字叙述型求绝对值,通常求某个数的绝对值,一般常给负数,为了更高效求得负数的绝对值,同学们可以记住负数的绝对值等于它的相反数,表示一个数的相反数相当于在一个数的前面负号,这样可能更快捷。这是解题的...
  • 算术运算符(1) + ():两个对象相加(2) - (减):两个数相减,得到一个负数或者正数(3) * (乘):两个数相乘或者是返回一个被重复若干次的字符串(4) / (除):两数相除(5) % (取模):两数相除,返回除法的余数...
  • 全体自然数的和等于-1/12,你八成听说过这说法,对不对?! 实际上,我的不少朋友不但是听说过这...正数加正数只可能得到正数,怎么会变成负数? 按照这样想下去,就越想越可怕了。难道常识都是靠不住的?难道...
  • 通过位运算计算int的减乘除: 加法原理:a+b 位的异或运算跟求'和'的结果一致: 异或 1^1=0 1^0=1 0^0=0 ...减去一个正数等于加上这个负数的补码.一个正数的补码是它的原码.一个负数的补码等于它的反码.
  • 补码运算减乘除原理

    万次阅读 多人点赞 2018-03-28 20:22:04
    首先我们来看为什么要使用补码运算法: 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的减. (真值的概念在本文最开头)... 我们知道, 根据运算法则减去一个正数等于加上一个负数...
  • 为什么补码是按位取反1的?

    千次阅读 2011-05-24 23:42:00
    <br /> 补码的目的是正数负数直接计算,要求是绝对值相同的正数负数相加等于0. 先假定用按位取反的方法(如00100111和11011000),则两数相加必然为11111111,此时再加一个1就全部是0了。...
  • 重点来了,首先正数的补码是其本身,负数的补码是其数值位取反1。要理解这概念,要始终记住两字“时钟”。 3点减7点等于多少? 你别说-4点,等于8点,-7 =12-7=5,3+5=8,要区分运算过后的补码是正数还是负数...
  • 我们知道这个负数用补码去表示后,可以和正数一样去处理。在计算机中就是用一个加法器就可以实现了,没必要单独为了负数的加法运算配一个减法器。 这里直接给出一个公式: [x]补 + [y]补 = [x+y]补 (mod 2n+1) ...
  • 位运算用补码进行运算,正数的补码就是原码,负数的补码为原码取反1;计算得出的结果如果是正数,就直接等于补码,若是负数则需减1取反,取反时符号位不变。 位运算的运算符 位运算的运算符有以下6种: 1 - ...
  • 两天题系列: 准备鞭策自己瞎做两天题系列,关于每题写篇感悟和理解。 题目: 摘自LeetCode,难度简单。 判断给定数中质数的个数,并...第层循环将给定数n从3开始,依次往上,直到循环数等于给定数...
  • 小数点后第位大于5正数负数全部1,等于5,只有正数加1,小于5正数负数都不1。 math.ceil() ‘ceil’按‘天花板’理解,不论正数负数都取最大值,只要小数点后有小数就1。 math.floor() ‘floor’按地面...
  • 已知一个数X的补码,那么X的相反数的补码为:X的补码所有位数按位取反,最后再1 任意两数的补码之和等于两数之和的补码 [x]补+[y]补=[x+y]补 利用(负整数)原码求反码 正整数的原码,反码,补码都相同。 源码...
  • 一、题目描述 写一个函数,求两个整数之和,要求在函数...右移运算符(正数左边第一位补0,负数补1,等于除于2的n次方) >>> 无符号右移运算符(高位补0) 如果有进一步了解的需求的话可以参看这篇图解Ja
  • 原码:原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。反码:正数的反码就是原码,负数的反码等于原码除符号位...
  • 原码:原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。 反码:正数的反码就是原码,负数的反码等于原码除符号位...
  • 原码、反码和补码

    2019-06-11 19:28:34
    原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。 反码: 正数的反码就是原码,负数的反码等于原码除符号位以外...
  • 想了想是可以贪心过的,先遍历一遍,记录大于等于0的数的偶数个数和...剩下的情况就是正数的奇数个数为偶数(非零),这种情况可以先把所有正数加起来,然后比较负数里的第一个奇数和正数里的最后一个奇数的绝对值大小
  • 原码:就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码 反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有...
  • 国庆随笔

    2018-10-07 17:32:00
    原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。 正数的反码就是原码,负数的反码等于原码除符号位以外所有的位...
  • 原码:原码就是早期用来表示数字的一种方式: 一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。 反码:正数的反码就是原码,负数的反码等于原码除符号位...
  • 外边距如果都是正数或者都是负数,它们将形成一个外边距,合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。  2.外边距如果一个正数一个负数,则会进行叠加,两者相加,20px+(-10px)=10px  ...

空空如也

空空如也

1 2 3 4 5
收藏数 98
精华内容 39
关键字:

一个负数加一个正数等于