`
dsea
  • 浏览: 44536 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

反转一个整数的多种解法分析

阅读更多

 

    最近看到一篇文章,原文出处:http://coolshell.cn/articles/1391.html 。题目很简单,反转一个整数的符号,比如把1转成-1。看起来这是一个十分“弱智的”问题,不就是n=-n就可以了么。不过答案可不止这么一个,很多强人还给出了其他一些匪夷所思的答案。本人菜鸟,只能对所给出的部分答案做出分析,加深理解,不能造车,只能依葫芦画瓢了。

 

方法一:

		int x = numberToInvertSign;
		boolean pos = x > 0;
		for (int i = 0; i < 2 * Math.abs(x); i++) {
			if (pos) {
				numberToInvertSign--;
			} else {
				numberToInvertSign++;
			}
		}

 

   这种方法比较直观,如果x是正数,执行递减操作2x次,反之执行递增操作2x次,即可反转x。还有一个和这种方法类似的解法。

 

	x -= 2 * x;
 

方法二:

 

		int n = number; 
		n = (0xffffffff ^ n) + 1; 

 

  布尔运算^对应于逻辑运算异或,在命题逻辑中用符号⊕表示。P^Q,当P或者Q为真但不同时为真时,我们说P⊕Q成立。相应地,当P=1且Q=0,或者P=0且Q=1时,P^Q=1。

 

 

^ 0 1
0 0 1
1 1 0

 

表1. 异或运算

 

0xffffffff表示十六进制,与n异或后实际上是对n按位取反,然后加1,即得到相反的数。以下两种解法也是该原理:

 

n = ~n + 1; 
 n = ~--n; 

 

方法三:

 

public int invert(int n) {
    String nStr = String.valueOf(n);
 
    if (nStr.startsWith("-")) {
        nStr = nStr.replace("-", "");
    } else {
        nStr = "-" + nStr;
    }
 
    return Integer.parseInt(nStr);
}

 

    这种方法比较有趣,把整数n先转换成字符串,如果是'-'号开头,则替换为空字符,否则就在字符串开头加上'-',最后再转换成整形。

 

    如果想要查看更详细的信息,请点击原出处:http://coolshell.cn/articles/1391.html

 


分享到:
评论

相关推荐

    java-leetcode面试题解之第7题整数反转.zip

    题目描述通常简洁明了:给定一个32位有符号整数,你需要设计一个函数来反转这个整数。这意味着将整数的每一位按照相反的顺序排列。例如,如果输入是12345,则输出应该是54321;如果输入是-123,则输出应为-321。 ...

    java-leetcode题解之第92题反转链表II.zip

    具体来说,给定一个链表的头节点`head`、一个整数`m`和一个整数`n`,你需要反转从位置`m`到位置`n`的链表部分,其中位置`1`为链表的开头,位置`m`和`n`都是基于1的索引,且`n`总是大于`m`。 解决这类问题通常采用...

    LeetCode7 Reverse Integer

    这个题目要求我们给定一个32位有符号整数,将其数字顺序反转。例如,输入123,输出321;输入-123,输出-321。 在Java中,解决这个问题可以采用多种方法,但AC(Accepted)版本通常是指通过了所有测试用例的高效解法...

    程序设计II

    具体来说,首先读入一个正整数`repeat`(表示需要进行多少次插入操作),然后对于每一次插入操作,读入一个正整数`n`(表示已有序列的长度)以及`n`个已排序的整数,接着读入一个待插入的整数`x`,最后将`x`插入到...

    1、基础算法必练题(含解法)).pdf

    1. **Two Sum** (Easy): 给定一个整数数组和一个目标值,找出数组中和为目标值的那两个整数。这是基础的哈希表应用,时间复杂度为 O(n)。 2. **Valid Parentheses** (Easy): 检查括号字符串是否有效。可以使用栈来...

    华为面试180题(软件)

    - **问题**: 给定集合A和一个正整数K,构造一个大于K的最小正整数。 - **解法**: 优先考虑集合中的数字进行组合,从小到大尝试组合,直到找到符合条件的数。 ### 百度面试题解析 **24. 字符串反转** - **问题**...

    Amazon近半年电面题.pdf

    7. ReverseInteger: 需要将一个整数反转,同时要考虑到反转后的整数是否超出整型的范围。 8. StringtoInteger(atoi): 将字符串转换成整数,需要处理各种边界情况,如前导空格、非法字符、溢出等。 9. Palindrome...

    NOIP2011普及组测试数据

    1. **数字反转 reverse**:这道题可能要求参赛者编写一个程序,输入一个整数,然后将其每一位数字进行反转。例如,输入12345,输出54321。这通常涉及到对数字字符串的操作,包括将整数转化为字符串,反转字符串,...

    程序员编程艺术:面试和算法心得

    - **题目描述**: 给定一个整数数组,找出其中最大连续子数组的和。 - **分析与解法**: - 动态规划法:定义状态 f(i) 表示以第 i 个元素结尾的最大连续子数组和。 #### 三、树结构 **3.1 红黑树** - **知识点概述...

    力扣刷题总结c++ 解题报告(持续更新中)(csdn)————程序.pdf

    给定一个整数数组和一个目标值,任务是找到数组中两个数的索引,使它们相加等于目标值。解法一是简单的双层循环,时间复杂度O(n^2),效率较低。解法二和三利用了`unordered_map`来存储已遍历过的数值及其索引,当...

    三级网络100题

    - **基础知识**:字符串处理是编程中的一个重要方面,涉及到字符串的创建、修改、排序等多种操作。 - **示例题目**: - **题目53(字符串排序题)**:这类题目通常要求对字符串进行排序或重新排列。比如,可以要求...

    C语言基础练习题:素数判定与字符串反转实现

    习题2则展示了一个名为reverseString的函数的应用实例,在不需要额外数据结构的情况下,通过对原字符串进行高效互换,实现对其的整体反向呈现。 适合人群:有一定编程基础的学习C语言的学生,尤其是初学者。 使用...

    C语言基础-C语言编程基础之Leetcode编程题解之第31题下一个排列.zip

    在LeetCode的第31题"下一个排列"中,我们需要找到一个整数序列的下一个字典序排列。例如,给定序列[1,2,3],下一个排列是[1,3,2];给定序列[2,3,1],下一个排列是[2,1,3]。解决这类问题通常涉及到数组的操作和排序...

    程序员面试智力、算法题汇总一pdf

    解法中用到了一个辅助函数reverse,这个函数的作用是将数组从begin到end之间的元素进行反转。 接下来是求二进制中1的个数问题。解法一是通过不断模2操作来判断二进制最低位是否为1,然后将数字除以2,直到数字为0。...

    leetcode官方50题算法详解

    1. **反转整数(Reverse Integer)**:此题要求编写一个函数来反转一个整数,需要注意反转后的结果可能会超出整数的范围。 2. **整数转罗马数字(Integer to Roman)**:要将一个整数转换为罗马数字表示,需要了解...

    LeetCode前400题Java精美版

    7. **Reverse Integer** (Easy): 反转一个整数。需要注意整数溢出的问题,可以使用数学方法避免。 8. **String to Integer (atoi)** (Medium): 将字符串转换为整数。需要处理各种边界情况,如前导空格、正负号、...

    历年NOIP联赛第一题题目.pdf

    这是一个基础的编程题目,涉及对整数的每一位进行分离和重组,特别要注意负数反转时的最高位数字非零的要求。这类问题通常要求学生熟悉整数的表示和运算,以及字符串或数组的处理技巧。 NOIP2010年普及组第一题未...

    LeetCode算法设计

    1. **转置数字——解决溢出的思路[E]**:给定一个32位有符号整数,反转数字的各个数字。 2. **atoi——培养严谨的思路,正负号的处理技巧[E]**:实现一个`myAtoi(string s)`函数,使其能将字符串转换成整数。 3....

    面试手撕代码整理

    反转链表是数据结构中的一个基本操作,其核心思想是通过遍历链表,并在遍历过程中改变节点的指向,最终实现整个链表的逆序。在实现上,通常需要定义一个临时变量用于保存当前节点的下一个节点,然后修改当前节点的...

    C、C++编程(二)

    在第四段代码中,我们看到了如何将一个整数的二进制表示进行镜像反转,并将其转换回十进制数值。首先,通过位运算提取每一位,然后将这些位反向存储在一个数组中。接下来,通过遍历这个反向数组,可以构建出新的十...

Global site tag (gtag.js) - Google Analytics